Reference: http://www.cnblogs.com/ka200812/archive/2011/09/02/2164404.html

之前说过中国剩余定理传统解法的条件是m[i]两两互质,所以这题就不能用传统解法了= =

其实还有种方法:

先来看只有两个式子的方程组:

c≡b1 (mod a1)

c≡b2 (mod a2)

变形得c=a1*x+b1,c=a2*x+b2

a1*x-a2*y=b2-b1

可以用扩展欧几里得求出x和y,进而求出c

那么多个式子呢?可以两个两个的迭代求。

比如上面两个式子求完了,求出一个c,不妨先把它记作c1

c1满足上面两式,但对于所有的式子就不一定都满足了。

因此我们把一个新同余式加入方程组:c≡c1 (mod lcm(a1,a2))      //lcm为最小公倍数

然后依次往下迭代就行了。最后解出的c1就是最终解。

如何判断无解?

对于相邻的两行a1、a2、r1、r2,若 (r2-r1) mod (gcd(a1,a2))!=0说明无解

 #include "iostream"
using namespace std;
__int64 a[];
__int64 r[];
int n; __int64 extend_gcd(__int64 a,__int64 b,__int64 &x,__int64 &y){
if (b==){
x=;y=;
return a;
}
else{
__int64 r=extend_gcd(b,a%b,y,x);
y=y-x*(a/b);
return r;
}
} __int64 gcd(__int64 a,__int64 b)
{
if (b==) return a;
return gcd(b,a%b);
} __int64 lcm(__int64 a,__int64 b)
{
__int64 tm=gcd(a,b);
if (tm==) return ;
else return (a*b/tm);
} int main()
{
while (cin>>n)
{
for (int i=;i<=n;i++)
cin>>a[i]>>r[i]; __int64 x,y,x1,c1;
bool sol=true;
for (int i=;i<=n;i++)
{
__int64 a1=a[i-],r1=r[i-];
__int64 a2=a[i],r2=r[i];
__int64 tmp=gcd(a1,a2);
if ((r2-r1)%tmp!=) sol=false; //此处有个问题= =原来我是这样写的,WA了
__int64 tm=extend_gcd(a1,a2,x,y); //__int64 tm=extend_gcd(a1,-a2,x,y)
x1=x*((r2-r1)/tm); //but the original equation is a1*x1-a2*x2=b2-b1
__int64 rq=a2/tm; //__int64 rq=-a2/tm
x1=(x1%rq+rq)%rq; //去掉a2的负号就A了,What a fuck!!!
//个人猜想是因为gcd(a,b)和gcd(a,-b)结果是一样的,
//而且此处需要的是非负解,结果就YY对了
c1=a1*x1+r1;
r[i]=c1;
a[i]=lcm(a1,a2);
// cout<<r[i]<<" "<<a[i]<<endl;
}
//cout<<c1<<endl;
__int64 ans=c1;
if (!sol) cout<<"-1"<<endl;
else cout<<ans<<endl;
} return ;
}

至于负号那个地方有个题hdu 1576,和本题一个情况。把负号YY掉就对了= =

poj 2891 扩展欧几里得迭代解同余方程组的更多相关文章

  1. POJ 2891 Strange Way to Express Integers | exGcd解同余方程组

    题面就是让你解同余方程组(模数不互质) 题解: 先考虑一下两个方程 x=r1 mod(m1) x=r2 mod (m2) 去掉mod x=r1+m1y1   ......1 x=r2+m2y2   . ...

  2. poj 2142 扩展欧几里得解ax+by=c

    原题实际上就是求方程a*x+b*y=d的一个特解,要求这个特解满足|x|+|y|最小 套模式+一点YY就行了 总结一下这类问题的解法: 对于方程ax+by=c 设tm=gcd(a,b) 先用扩展欧几里 ...

  3. poj 1061 扩展欧几里得解同余方程(求最小非负整数解)

    题目可以转化成求关于t的同余方程的最小非负数解: x+m*t≡y+n*t (mod L) 该方程又可以转化成: k*L+(n-m)*t=x-y 利用扩展欧几里得可以解决这个问题: eg:对于方程ax+ ...

  4. poj 1061(扩展欧几里得定理求不定方程)

    两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特 ...

  5. 扩展欧几里得(exgcd)与同余详解

    exgcd入门以及同余基础 gcd,欧几里得的智慧结晶,信息竞赛的重要算法,数论的...(编不下去了 讲exgcd之前,我们先普及一下同余的性质: 若,那么 若,,且p1,p2互质, 有了这三个式子, ...

  6. poj 2115 扩展欧几里得

    题目链接:http://poj.org/problem?id=2115 题意: 给出一段循环程序,循环体变量初始值为 a,结束不等于 b ,步长为 c,看要循环多少次,其中运算限制在 k位:死循环输出 ...

  7. The Balance POJ 2142 扩展欧几里得

    Description Ms. Iyo Kiffa-Australis has a balance and only two kinds of weights to measure a dose of ...

  8. POJ 1061 扩展欧几里得

    #include<stdio.h> #include<string.h> typedef long long ll; void gcd(ll a,ll b,ll& d, ...

  9. 扩展欧几里得,解线性同余方程 逆元 poj1845

    定理:对于任意整数a,b存在一堆整数x,y,满足ax+by=gcd(a,b) int exgcd(int a,int b,int &x,int &y){ ){x=,y=;return ...

随机推荐

  1. SQL Server进制

    在项目中,大家可能都遇到过,需要把十进制转换为其他进制的情况,google上一搜,已经有很多2进制.8进制.16进制和十进制的转换方法.但是在一些项目中,这些可能无法满足要求,可能需要17.18甚至是 ...

  2. java 14 -5 System类

    System类包含一些有用的类字段和方法.它不能被实例化. 方法: 1.public static void gc():运行垃圾回收器. 2.public static void exit(int s ...

  3. Android优化—— Google 发布 Android 性能优化典范

    阅读目录 0)Render Performance 1)Understanding Overdraw 2)Understanding VSYNC 3)Tool:Profile GPU Renderin ...

  4. oracle用sqlplus创建新用户,不是plsql developer

    1.sqlplus /nolog 2.conn /as sysdba 3.alter user system identified by "123456"; 4.alter use ...

  5. [Elixir007] on_definition规范函数定义时的各种潜规则

    1.需求 写一个基于memcache的cache模块, 需要在key前面加上特定的前缀, 所以user cache的原始的store函数应该写成 # user.exdef store(user_id, ...

  6. C语言 百炼成钢15

    //题目43:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出 //圈子,问最后留下的是原来第几号的那位. #include<stdio.h> #inclu ...

  7. Android 动画之AlphaAnimation应用详解

    窗口的动画效果,淡入淡出什么的,有些游戏的欢迎动画,logo的淡入淡出效果就使用AlphaAnimation.AlphaAnimation(0.01f, 1.0f); 从0.01f到1.0f渐变.学过 ...

  8. Java系列:关于Java中的桥接方法

    这两天在看<Java核心技术 卷1>的泛型相关章节,其中说到了在泛型子类中override父类的泛型方法时,编译器会自动生成一个桥接方法,这块有点看不明白. 书上的例子代码如下: publ ...

  9. [CareerCup] 12.6 Test an ATM 测试一个自动取款机

    12.6 How would you test an ATM in a distributed banking system? 这道题问我们如何来测试一个自动取款机,我们首先要询问下列问题: - 谁来 ...

  10. 学习笔记——Maven pom.xml配置详解

    POM的全称是“ProjectObjectModel(项目对象模型)”. pom.xml详解 声明规范 <projectxmlns="http://maven.apache.org/P ...