[HDU1573]X问题(扩展中国剩余定理)
2017-01-14 16:37
260 查看
题目描述
传送门题解
就是中国剩余定理的模型但是不保证每一个模数互质两个同余方程是可以合并的
x1≡c1(modm1)
x2≡c2(modm2)
化一坨式子最后可以合并成
x≡inv(m1(m1,m2),m2(m1,m2))∗(c2−c1)(m1,m2)%m2(m1,m2)∗m1+c1(modm1m2(m1,m2))
注意第一个运算由于是求一个同余式的逆元所以一定要及时取模否则容易炸
代码
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> using namespace std; int T,n,k,m1,m2,c1,c2,t,ans; int m[15],c[15]; bool flag; int gcd(int a,int b) { if (!b) return a; else return gcd(b,a%b); } void exgcd(int a,int b,int &x,int &y) { if (!b) x=1,y=0; else exgcd(b,a%b,y,x),y-=a/b*x; } int inv(int a,int b) { int x=0,y=0; exgcd(a,b,x,y); x=(x%b+b)%b; if (!x) x+=b; return x; } int main() { scanf("%d",&T); while (T--) { scanf("%d%d",&n,&k);flag=true; for (int i=1;i<=k;++i) scanf("%d",&m[i]); for (int i=1;i<=k;++i) scanf("%d",&c[i]),c[i]%=m[i]; for (int i=2;i<=k;++i) { m1=m[i-1];m2=m[i];c1=c[i-1];c2=c[i]; m1=m[i-1],m2=m[i],c1=c[i-1],c2=c[i]; t=gcd(m1,m2); if ((c2-c1)%t!=0) {flag=false;break;} m[i]=m1*m2/t; c[i]=((inv(m1/t,m2/t)*((c2-c1)/t)%(m2/t)*m1+c1)%m[i]+m[i])%m[i]; } if (!flag) puts("0"); else { if (n<c[k]) {puts("0");continue;} ans=(n-c[k])/m[k]+1; if (!c[k]) --ans; printf("%d\n",ans); } } }
相关文章推荐
- hdu1573 X问题(中国剩余定理)
- hdu1573中国剩余问题定理模数非互质的的情况
- HDU 1573 X问题 数论-(中国剩余定理)
- HDU-1573 X问题(中国剩余定理)
- hdu-1573 X问题(中国剩余定理)
- 扩展的欧几里得&中国剩余定理
- 【HDU1573】X问题 中国剩余定理
- hdu1573 X问题(中国剩余定理解的个数)
- hdu 1573 x问题(中国剩余定理)HDU 2007-1 Programming Contest
- codeforces 710D Two Arithmetic Progressions (扩展中国剩余定理)
- HDU 1573X问题(中国剩余定理)
- 1.2 中国象棋将帅问题进一步讨论与扩展:如何用1个变量实现N重循环?[chinese chess]
- HDU 1573 X问题 (中国剩余定理)
- HDU 1573 X问题 (中国剩余定理)
- X问题(中国剩余定理+不互质版应用)hdu1573
- HDU 1573 X问题 数论-(中国剩余定理)
- (中国剩余定理) hdu 1573 X问题
- [BZOJ 1407][NOI 2002]Savage(中国剩余定理+扩展欧几里得)
- HDU - 1573 X问题 (中国剩余定理)
- hdu 1573 X问题 (中国剩余定理)