HDU 2669 Romantic 扩展欧几里德---->解不定方程
Romantic
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2385 Accepted Submission(s): 944
The Birds is Fly in the Sky.
The Wind is Wonderful.
Blew Throw the Trees
Trees are Shaking, Leaves are Falling.
Lovers Walk passing, and so are You.
................................Write in English class by yifenfei
Girls are clever and bright. In HDU every girl like math. Every girl like to solve math problem!
Now tell you two nonnegative integer a and b. Find the nonnegative integer X and integer Y to satisfy X*a + Y*b = 1. If no such answer print "sorry" instead.
Each case two nonnegative integer a,b (0<a, b<=2^31)
(1)求解不定方程;
(2)求解模线性方程(线性同余方程);
(3)求解模的逆元;
这一道题目是第一种运用.
我们要求的是 (1). ax+by=c ,满足非负而且最小的x。
1. 要满足(1)有解,那么必须要满足 c%gcd(a,b)==0.为什么呢?
{ 对于gcd(a,b),我们可以知道 a%gcd(a,b)==b%gcd(a,b)==0;最大公约数的知识啊。
显然 (ax+bx) %gcd(a,b)==0 如果等式成立,左边和右边能够相等,那么c%gcd(a,b)==0.}
2.先把式子的左边提取出来得到 ax+by,根据欧几里德的知识可以写成 (2). ax+by=gcd(a,b);
那么就转化成先求 (2).
在扩展欧几里德的代码中,Ex_GCD(a,b,&x,&y);实际上已经求得了一组解。
他们分别是回溯得到的x,y; 为了区别,我们把它叫成x0,y0;
对于ax+by=gcd(a,b)的通解满足
x=x0+b/gcd(a,b)*t;
y=y0-a/gcd(a,b)*t; (t为任意整数)
这又是怎么得到的呢????
{ 由于ax+by=gcd(a,b) 等价于 a(x+b/gcd(a,b)*t) + b(y-a/gcd(a,b)*t)=gcd(a,b);}
3.知道了ax+by=gcd(a,b),那么对于ax+by=c,只要在(2)*c/gcd(a,b)。
原先的x0 转变成 x1=x0*c/gcd(a,b);
y1=y0*c/gcd(a,b);
ax+by=c的通解就可以写成
x=x1+b/gcd(a,b);
y=y1 -a/gcd(a,b);
4.要得到最小非负x的值.
更加x=x1+b/gcd(a,b); 那么满足 x=x%(b/gcd(a,b); while(x<0) x=x+b/gcd(a,b);
参考http://www.cnblogs.com/void/archive/2011/04/18/2020357.html
____________________________________________________________________________
步骤:
赋值k=Ex_GCD(a,b,x,y);也就是k=GCD(a,b);
1.判断 (c%d==0)? No or Yes
2.x=x*c/k;//因为ax+by=c 和 ax+by=gcd(a,b)的转化。
3.b=b/k; //同理
4.b=x%b; while(x<0) x=x+b;
5.根据ax+by=c ==> y= (c-ax)/b;
/*
扩展欧几里德模板题。 */ #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std; __int64 Ex_GCD(__int64 a,__int64 b,__int64 &x,__int64 &y)//扩展欧几里得
{
if(b==)
{
x=;
y=;
return a;
}
__int64 g=Ex_GCD(b,a%b,x,y);
__int64 hxl;
hxl=x-(a/b)*y;
x=y;
y=hxl;
return g;
} int main()
{
__int64 a,b,k,x,y;
while(scanf("%I64d%I64d",&a,&b)>)
{
k=Ex_GCD(a,b,x,y);
if(k!=) //因为题目要求 X*a + Y*b = 1
{ //所以必须要满足 1 %GCD(a,b) ==0 才有解
printf("sorry\n");
continue;
}
x=x*/k;//由于c=1 而且k=1 ,所以没有必要这一步的。
//题目要求选择最小非负的x。
b=b/k;//这一步也没有必要了
x=x%b;
if(x<) x=x+b; //防止x为负数
y=(-a*x)/b; //这个根据 a*x+b*y=1 =>y=(1-a*x)/b;
printf("%I64d %I64d\n",x,y);
}
return ;
}
HDU 2669 Romantic 扩展欧几里德---->解不定方程的更多相关文章
- HDU 2669 Romantic(扩展欧几里德, 数学题)
题目 //第一眼看题目觉得好熟悉,但是还是没想起来//洪湖来写不出来去看了解题报告,发现是裸的 扩展欧几里得 - - /* //扩展欧几里得算法(求 ax+by=gcd )//返回d=gcd(a,b) ...
- HDU 2669 Romantic (扩展欧几里得定理)
Romantic Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- hdu 2669 Romantic 扩展欧几里得
Now tell you two nonnegative integer a and b. Find the nonnegative integer X and integer Y to satisf ...
- POJ 1061 青蛙的约会 扩展欧几里德--解不定方程
青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 81606 Accepted: 14116 Descripti ...
- HDU 2669 Romantic(扩展欧几里德)
题目链接:pid=2669">http://acm.hdu.edu.cn/showproblem.php?pid=2669 Problem Description The Sky is ...
- HDU 2669 Romantic【扩展欧几里德】
裸的扩展欧几里德,求最小的X,X=((X0%b)+b)%b,每个X都对应一个Y,代入原式求解可得 #include<stdio.h> #include<string.h> ty ...
- hdu 2669 Romantic
Romantic Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Sta ...
- HDU2669 Romantic 扩展欧几里德 对我来说有陷阱
这道题对我来说有陷阱虽说是赤果果的扩展欧几里德,看样子基本攻还是不够哈,基本功夫一定要好,准备每天上那种洗脑课时分 多看看数论书,弥补一下 自己 狗一样的基础, 这道题用到了一个性质: 对于不定整数 ...
- hdu 2669 Romantic (乘法逆元)
Romantic Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
随机推荐
- Python os.walk() 遍历出当前目录下的文件夹和文件
os.walk目录遍历 os.walk的参数如下: os.walk(top, topdown=True, onerror=None, followlinks=False) 其中: - top是要遍历的 ...
- java之JIT(Just in time)
Java程序最初是通过解释器进行解释执行的,当虚拟机发现某个方法或代码块运行的特别频繁时,会把这些代码认定为“热点代码”(Hot Spot Code).为了提高热点代码的执行效率,在运行时,虚拟机会把 ...
- Good Bye 2017(送命场)
9815人数场,9500+围观神仙打架...断断续续打Codeforces也快有一年啦,第一次打Good Bye场,满怀前排膜tourist的心愿参加了这场送命场,虽然没看到tourist.不过还是得 ...
- 非常好用的@ResponseBody注解
AJAX的写法: ajax接收json格式: ①如果ajax接收的是text dataType:"text", var json = eval("(" + da ...
- python 爬虫之 正则的一些小例子
什么是正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是 事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符”,这个“规则字符” 来表达对字符的一种过滤逻辑. 正则并不是pyth ...
- AngularJS入门之动画
AngularJS中ngAnimate模块支持动画效果,但是ngAnimate模块并未包含在AngularJS核心库中,因此需要使用ngAnimate需要在定义Module时声明对其的引用. Angu ...
- Centos7下CPU内存等资源监控
1.查看内存使用情况: [root@takeout web-takeout]# free -m total used free shared buff/cache available Mem: 378 ...
- easyUI制作slider小滑块,可拖动和精确输入
借助easyUI制作.完善slider小滑块. 可拖动.和在右边输入框精确输入 效果图: html代码: <div class="text_fl" >亮度设置:< ...
- 手淘适配-flexible
目标 拿一个双11的Mobile页面来做案例,比如你实现一个类似下图的一个H5页面: 目标很清晰,就是做一个这样的H5页面. 痛点 虽然H5的页面与PC的Web页面相比简单了不少,但让我们头痛的事情是 ...
- grep常用用法
grep常用用法 [root@www ~]# grep [-acinv] [--color=auto] '搜寻字符串' filename 选项与参数: -a :将 binary 文件以 text 文件 ...