中国剩余定理CRT (互质)
2016-07-15 17:40
302 查看
中国剩余定理给出了以下的一元线性同余方程组:
有解的判定条件,并用构造法给出了在有解情况下解的具体形式。
中国剩余定理说明:假设整数m1,m2, … ,mn两两互质,则对任意的整数:a1,a2, … ,an,方程组 有解,并且通解可以用如下方式构造得到:
设M是整数m1,m2, … ,mn的乘积,并设Mi是除了mi以外的n- 1个整数的乘积。
设为Mi^-1模mi的数论倒数 :
方程组的通解形式为
:在模M的意义下,方程组
只有一个解:
例题 POJ 1006
51nod 1079
有解的判定条件,并用构造法给出了在有解情况下解的具体形式。
中国剩余定理说明:假设整数m1,m2, … ,mn两两互质,则对任意的整数:a1,a2, … ,an,方程组 有解,并且通解可以用如下方式构造得到:
设M是整数m1,m2, … ,mn的乘积,并设Mi是除了mi以外的n- 1个整数的乘积。
设为Mi^-1模mi的数论倒数 :
方程组的通解形式为
:在模M的意义下,方程组
只有一个解:
例题 POJ 1006
51nod 1079
#include <iostream> #include <cstdio> #include <vector> using namespace std; typedef long long ll ; ll exgcd(ll a ,ll b , ll &x ,ll &y ) { if(!b) { x = 1 , y = 0 ; return a ; } else { ll d = exgcd(b,a%b,x,y) ; ll t = x ; x = y ; y = t - a/b*y ; return d ; } } int main() { ll n ; while(~scanf("%lld",&n)){ vector<ll> p,m,a; p.clear() ; m.clear() ; a.clear() ; long long M = 1 , ans = 0 ; for(ll pi,ai,i=0 ; i<n ; ++i){ scanf("%lld%lld",&pi,&ai) ; p.push_back(pi) ; a.push_back(ai) ; M *= pi ; } for(ll i=0 ; i<n; ++i){ m.push_back(M/p[i]) ; ll x ,y ; exgcd(m[i],p[i],x,y) ; if(x<0)x+=p[i] ; // cout << x << " " << y <<endl ; ans = (ans+a[i]*x*m[i])%M; //cout << ans << endl; } // ans = (ans+M)%M ; std::cout<<ans<<std::endl; } return 0 ; }
相关文章推荐
- 面试题36:数组中的逆序对
- Sparse Convolution neural networks
- IBM CleanQuest使用方法
- 【旧代码整理】分享带cookie的PHP Curl操作class,再简单说说curl配合socks5代理、IP变身
- 【Android】使用Gradle实现分渠道打包,指定应用名称,应用图标,应用标识和环境切换
- 浅谈消息队列
- JavaScript的open()方法:打开新窗口
- Xcode 创建.a和framework静态库
- MFCC
- C#中一个简单的输入输出流
- Gerrit日常操作命令收集
- CnCrypt代码 之 为对话框动态增加菜单
- 5个你必须知道的JavaScript和Web Debug技术
- angularjs 刷新 404
- 底部弹出框
- 五分钟学会 Canvas 基础(二)
- python爬取网站美女图片
- Scalaz(47)- scalaz-stream: 深入了解-Source
- 启动Service时注意事项
- LeetCode[292] Nim Game