Hello Kiki(hdu3579线性同与方程)
2013-10-26 15:13
309 查看
题意:X = Ai (mod Mi) 给你Ai和Mi 计算最小正整数x,最小正整数解不能是0,如果为0那么解就是n个Ai的最小公倍数
思路:线性同余方程组
线性同余方程组解法:/article/10243984.html
思路:线性同余方程组
线性同余方程组解法:/article/10243984.html
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; typedef long long int64; int64 Exgcd(int64 a,int64 b,int64& x,int64 &y) { if(b == 0) { x = 1,y = 0; return a; } else { int64 r = Exgcd(b,a%b,x,y); int64 temp = x; x = y; y = temp - a/b*y; return r; } } int64 A[10]; int64 R[10]; int main() { int t,cas = 1; scanf("%d",&t); while(t--) { int64 n; scanf("%I64d",&n); for(int i = 0; i < n; i++) { scanf("%I64d",&A[i]); } for(int i = 0; i < n; i++) { scanf("%I64d",&R[i]); } bool flag = 1; int64 a1 = A[0],r1 = R[0],x,y; for(int i = 1; i < n; i++) { int64 a = a1,b = A[i],c = R[i] - r1,d; d = Exgcd(a,b,x,y); if(c % d != 0) { flag = 0;break; } b = b / d; x = x * (c/d); x = (x % b + b) % b; r1 = x * a1 + r1; a1 = a1*(A[i]/d); } if(flag) { if(r1 != 0) printf("Case %d: %I64d\n",cas++,r1); else printf("Case %d: %I64d\n",cas++,r1+a1); } else printf("Case %d: -1\n",cas++); } return 0; }
相关文章推荐
- KVM 半虚拟化驱动
- Java Hour 10
- 递归过深,栈溢出
- a letter and a number
- Module development Template for DNN 7.0
- SCOM2012R2 APM系列(一)配置.NET应用程序监控
- 中国34个省未来发展趋势深度分析
- LeetCode题解:Anagrams
- 注重实效的程序员
- 第五章及其嵌套类
- Matlab基本函数-ceil函数
- 【多线程】——join()方法实现并行计算
- php中实现HmacMd5算法的源代码
- PHP上传图片在不同浏览器和浏览器模式中的问题及解决 image/jpeg 和 image/pjpeg
- 【面向对象】——编译时看父类,运行时看子类
- django1.5.5使用mysql
- Eqs hash表存储,注意hash要用char类型
- 关于java正则表达式贪婪模式和勉强模式的研究
- Lucene 需要索引的文本文件太大,怎么解决?
- LDD3源码学习日记<四>