剩余定理
2016-03-02 23:26
344 查看
因为(Mi,mi)=1,所以存在x,y使Mi*xi+mi*yi=1,用egcd求解x。
再另Pi=Mi*xi,结果为∑Pi*ai
再另Pi=Mi*xi,结果为∑Pi*ai
#include<iostream> using namespace std; void egcd(int a,int b,int &x,int &y) { if(b==0) { x=1; y=0; return; } egcd(b,a%b,x,y); int xx=x; x=y; y=xx-a/b*y; return ; } int CRT(int a[],int m[],int n) { int i,M=1,x,y,Mi; for(i=1;i<=n;i++) M*=m[i]; int res=0; for(i=1;i<=n;i++) { Mi=M/m[i]; egcd(Mi,m[i],x,y); x%=m[i]; //防止x为负数。当然了,把return res 改成return (res%M+M)%M更加简洁 x=(m[i]+x)%m[i]; res=(res+Mi*x*a[i])%M; } return res; } int main() { int sum,n,a[1000],m[1000]; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]>>m[i]; sum=CRT(a,m,n); cout<<sum<<endl; }
相关文章推荐
- 文件分割合并
- 表达式的副作用解释【引用】
- Ember Debug Adapter (ISA3) --- Feature
- 装饰器模式
- C#之使用委托查找任意单一类型数组的最大值
- Android 中自定义控件和属性(attr.xml,declare-styleable,TypedArray)的方法和使用
- 2.6.30内核Netfilter的简单例子、一(DropAll) http://blog.csdn.net/sahusoft/article/details/4540886
- JavaScript的祖师爷-----布兰登艾奇
- Selenium的高级应用
- css中常用的几种居中方法
- 【C#】基础知识—字符与字符串
- 快手sig计算
- 滚动条的创建(1)
- Selenium如何操作页面元素
- JAVA设计模式之代理模式(静态代理和动态代理)
- SVN服务器搭建和使用
- 让delphi程序不受WINDOWS日期格式的影响(使用SetLocaleInfo函数和Application.UpdateFormatSettings)
- 分割字符传的3中方式
- 源码一
- 动态分配内存函数——calloc,free,malloc,realloc