【模板】【POJ2891】扩展中国剩余定理
2017-07-26 14:27
357 查看
exCRT适用于模数两两不互素的情况,思路是把方程两两合并即可,具体看这个博客吧:传送门
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; typedef long long LL; const int N=1005; int k; LL c ,m ; bool flag; LL gcd(LL a,LL b) { return b?gcd(b,a%b):a; } LL exgcd(LL a,LL b,LL &x,LL &y) { if(!b) {x=1;y=0;return a;} else exgcd(b,a%b,y,x),y-=a/b*x; } LL inv(LL a,LL mod) { LL x,y; exgcd(a,mod,x,y); return (x%mod+mod)%mod; } LL exCRT(int k) { LL m1,m2,c1,c2,g; for(int i=2;i<=k;i++) { m1=m[i-1],m2=m[i]; c1=c[i-1],c2=c[i]; g=gcd(m1,m2); if((c2-c1)%g) {flag=0;return -1;} m[i]=m1*m2/g; c[i]=inv(m1/g,m2/g)*((c2-c1)/g)%(m2/g)*m1+c1; c[i]=(c[i]%m[i]+m[i])%m[i]; } return c[k]; } int main() { while(~scanf("%d",&k)) { for(int i=1;i<=k;i++) scanf("%lld%lld",&m[i],&c[i]); printf("%lld\n",exCRT(k)); } return 0; }
相关文章推荐
- <《模板》扩展欧几里德--求二元一次方程-及中国剩余定理>
- 扩展中国剩余定理模板
- 扩展欧几里得、求乘法逆元及其应用、中国剩余定理(互质版和非互质版)、欧拉函数、快速判素数模板
- 数论快速入门(同余、扩展欧几里德、中国剩余定理、大素数测定和整数分解、素数三种筛法、欧拉函数以及各种模板)
- 扩展欧几里得、逆元、线性同余方程组、中国剩余定理总结
- 欧几里得+扩展的欧几里得算法+线性同余方程+中国剩余定理
- 中国剩余定理模板
- poj 1006 中国剩余定理模板
- 扩展中国剩余定理讲解
- 【中国剩余定理模板】
- 再说中国剩余定理、扩展欧几里德与同余方程组
- 【Codeforces2015ICL,Finals,Div. 1#J】Ceizenpok's formula(扩展Lucas定理+中国剩余定理)
- LOJ2721 [NOI2018] 屠龙勇士 【扩展中国剩余定理】
- 中国剩余定理 模板
- poj 1006 中国剩余定理模板
- 中国剩余定理模板(互质的情况)
- [BZOJ2142] 礼物 - Lucas定理及扩展 - 中国剩余定理 - 扩展欧几里得算法
- 【BZOJ2445】最大团【推公式】【中国剩余定理】【扩展Lucas】
- [BZOJ 1951][Sdoi2010]古代猪文:Lucas定理|中国剩余定理|费马小定理|扩展欧几里得
- 扩展GCD 中国剩余定理(CRT) 乘法逆元模版