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 ...
随机推荐
- IAP远程在线升级
IAP远程在线升级 在上一篇中实现了LWIP网口通讯,那么肯定要加个在线升级功能,这个功能所占用的资源很少,但在物联网中很重要也很实用.在线升级就是像手机一样,先下载好系统,然后点击升级~然后就没然后 ...
- 预处理函数在app和蓝图级别的不同使用
app级别 from flask import Flask from flask_sqlalchemy import SQLAlchemy # SQLAlchemy 类实例对象的创建一定要在引用蓝图之 ...
- django-ORM相关代码及其sql执行次数
1.普通情况:通过log可以看出,这种情况下,访问了1次数据库 def test(request): """测试连表""" users = ...
- SQL一些问题
什么是索引: 一般说法:索引是与表关联的磁盘上结构,可以加快从表中检索行的速度.索引包含由表中的一列或多列生成的键.这些键存储在一个结构中,使 SQL Server 可以快速有效地查找与键值关联的行. ...
- Java_使用日志
日志有什么用? 在实际开发中,不可能使用控制台输出所有数据,可以用日志把程序运行的过程记录下来,包括运行中出现的异常和BUG 当出现问题的时候,程序员可以去查看日志,从而能快速的找到问题所在. 一般来 ...
- 【xsy1156】 树套树(tree) 倍增
题目大意:给你$m$棵由$n$个点构成的全等的树$A$.这$m$棵树之间有$m-1$条边相连,组成了一棵大树. 有$q$组询问,每次询问这棵大树上两点之间的距离. $n,m,q≤10^5$ 这是一道小 ...
- Ethereum White Paper
https://github.com/ethereum/wiki/wiki/White-Paper White Paper EditNew Page James Ray edited this pag ...
- (转)MySQL 线程池内幕
原文:http://blog.jobbole.com/109695/ http://mysqllover.com/?p=826 http://blog.csdn.net/hsuxu/article/d ...
- SQLite使用入门
什么是SQLite SQLite是一款非常轻量级的关系数据库系统,支持多数SQL92标准.SQLite在使用前不需要安装设置,不需要进程来启动.停止或配置,而其他大多数SQL数据库引擎是作为一个单独的 ...
- python的强制转换(当出现 not supported between instances of 'str' and 'int' 的错误时)
当我们编程时,有时会出现如下错误:TypeError: '>' not supported between instances of 'str' and 'int' 如下图: 这是因为input ...