中国剩余定理
2016-04-11 20:21
429 查看
若m1,m2,m3,...mr是两两互素的正整数,则同余方程组x=a1(mod m1),x=a2(mod m2),x=a3(mod m3)...x=ar(mod mr)
有模M=m1,m2,m3,....mr的唯一解,即为中国剩余定理。
令Mi=M/mi,因为m1,m2,m3,...mr两两互素,因此(Mi,mi)=1,即MiPi=1(mod mi);
a1M1P1+a2M2P2+a3M3P3+....+arMrPr,就是同余方程组的解。
有模M=m1,m2,m3,....mr的唯一解,即为中国剩余定理。
令Mi=M/mi,因为m1,m2,m3,...mr两两互素,因此(Mi,mi)=1,即MiPi=1(mod mi);
a1M1P1+a2M2P2+a3M3P3+....+arMrPr,就是同余方程组的解。
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <set> #include <map> #include <queue> #include <string> #define LL long long #include<iostream> using namespace std; int m[100],a[100],M; int exgcd(int a,int b,int &x,int &y) { int x1,y1; if(b==0) { x=1,y=0; return a; } int r=exgcd(b,a%b,x1,y1); x=y1; y=x1-a/b*y1; return r; } int ch_reminder(int len) { int i,Mi,x,y,d,ans=0; M=1; for(i=0;i<len;i++) M*=m[i]; for(i=0;i<len;i++) { Mi=M/m[i]; exgcd(Mi,m[i],x,y); ans=(ans+Mi*x*a[i])%M; } if(ans<0) ans+=M; return ans; } int main() { int n,i; cin>>n; for(i=0;i<n;i++) cin>>m[i]>>a[i];//m[i]:除数;a[i]:余数。 int ans=ch_reminder(n); cout<<ans<<endl; return 0; }
相关文章推荐
- Problem G: C语言习题 成绩输出
- 第7周-项目3-用多文件组织多个类的程序
- poi追加内容
- Tomcat安装教程
- Nginx安装及配置文件nginx.conf详解
- Auto Layout深入理解,及masonry简介
- IOS开发-UI学习-UITabBarController的使用
- edittext_解释
- 数据库设计 Step by Step (6) —— 提取业务规则
- MySQL表字段的创建、删除、修改操作
- Android学习笔记之ListView
- 【rapid-generator】代码生成器工具使用
- linux文件属性(1)
- maven
- 莫比乌斯反演之入门
- Square 之 Retrofit 使用详解
- python 模拟登录
- 第六周【项目3-IP地址类】
- 也谈http中get和post
- ptr