【数论】【扩展欧几里得】hdu3579 Hello Kiki
2017-03-21 18:24
465 查看
解一元线性同余方程组(模数不互质)
结合看这俩blog讲得不错
http://46aae4d1e2371e4aa769798941cef698.devproxy.yunshipei.com/qq_27599517/article/details/50887445
上面这个对于理解为什么要用最小公倍数有帮助
http://blog.csdn.net/thearcticocean/article/details/49452859
思路就是不断两两合并,成一元线性同余方程,然后不断用扩欧求解
由于是最小的正整数解,而非非负整数解,所以最后答案如果是0,要加上模数的最小公倍数
结合看这俩blog讲得不错
http://46aae4d1e2371e4aa769798941cef698.devproxy.yunshipei.com/qq_27599517/article/details/50887445
上面这个对于理解为什么要用最小公倍数有帮助
http://blog.csdn.net/thearcticocean/article/details/49452859
思路就是不断两两合并,成一元线性同余方程,然后不断用扩欧求解
由于是最小的正整数解,而非非负整数解,所以最后答案如果是0,要加上模数的最小公倍数
#include<cstdio> using namespace std; int a[10],r[10],T,n; void exgcd(int a,int b,int &d,int &x,int &y) { if(!b) { d=a; x=1; y=0; } else { exgcd(b,a%b,d,y,x); y-=x*(a/b); } } int main(){ // freopen("c.in","r",stdin); scanf("%d",&T); for(int zu=1;zu<=T;++zu){ scanf("%d",&n); for(int i=1;i<=n;++i){ scanf("%d",&a[i]); } for(int i=1;i<=n;++i){ scanf("%d",&r[i]); } int a1=a[1],r1=r[1]; for(int i=2;i<=n;++i){ int a2=a[i],r2=r[i]; int d,x0,y0; int c=r2-r1; exgcd(a1,a2,d,x0,y0); if(c%d){ r1=-1; break; } int t=a2/d; x0=(x0*(c/d)%t+t)%t; r1=a1*x0+r1; a1=a1*(a2/d); } printf("Case %d: %d\n",zu,r1==0 ? r1+a1 : r1); } return 0; }
相关文章推荐
- [hdu 4828]Grids 数论(扩展欧几里得求逆元)
- 数论 + 扩展欧几里得 - SGU 106. The equation
- 数论学习之扩展欧几里得
- 数论 扩展欧几里得用法详解
- poj 2142 The Balance 数论-扩展欧几里得
- 数论 —— 逆元(费马小定理/扩展欧几里得)
- (Relax 数论1.6)POJ 1061 青蛙的约会(扩展的欧几里得公式)
- ZOJ3609——数论基础 扩展欧几里得求解乘法逆元
- POJ 2115 C Looooops [扩展欧几里得]【数论】[水]
- 【数论】扩展欧几里得
- 数论 - 用扩展欧几里得解模线性方程ax≡b (mod n) + 生理周期
- hiho 1297 数论四·扩展欧几里得
- 【hdu3579-Hello Kiki】拓展欧几里得-同余方程组
- 数论(欧几里得,扩展欧几里得,欧拉)
- hdu3579 Hello Kiki(数论)
- 总结——数论:欧几里得算法&扩展欧几里得
- 【数论】【快速幂】【扩展欧几里得】【BSGS算法】bzoj2242 [SDOI2011]计算器
- 数论-hdu-1576-A/B-逆元-扩展欧几里得
- 扩展欧几里得【数论
- poj1061 青蛙的约会 (数论,扩展欧几里得)