- 原题链接:Here!
- 思路:典型模线性方程组的题,需要注意的是如果最后解为0,需要输出M[]的lcm。这是为什么呢?如果解为0,也就是说当 0 ≡ Ai ( mod Mi ) (1 <= i <= n),即Ai = Mi*c(c为非负整数)原来的同余方程X ≡ Ai( mod Mi )变为 X = Mi*k (k为非负整数),出现这种情况的只能是X为lcm( M1,M2,M3,....,Mn )。
- 代码:
#include<bits/stdc++.h> using namespace std; typedef long long LL; LL gcd(LL a,LL b){ return b==0?a:gcd(b,a%b); } LL exgcd(LL a,LL b,LL &x,LL &y){ if(b==0){ x=1; y=0; return a; } LL d = exgcd(b,a%b,x,y); LL tmp = x; x = y; y = tmp - a/b*y; return d; } LL solve(LL a[],LL b[],LL num){ LL a1,a2,b1,b2,k1,kk,tmp,d,x,y,c; bool ok = true; a1 = a[0]; b1 = b[0]; for(int i=1;i<num;i++){ a2 = a[i]; b2 = b[i]; c = b2 - b1; d = exgcd(a1,a2,x,y); if(c%d){ ok = false; break; } tmp = a2/d; k1 = x*c/d; kk = (k1%tmp + tmp) % tmp; b1 = b1 + a1*kk; a1 = a1*a2/d; } if(!ok) return -1; else return b1; } int main(){ LL t,n,M[100],A[100],lcm; int kase = 0; cin>>t; while(t--){ lcm = 1; cin>>n; for(int i=0;i<n;i++){ cin>>M[i]; lcm = lcm/gcd(lcm,M[i])*M[i]; } for(int i=0;i<n;i++) cin>>A[i]; LL ans = solve(M,A,n); printf("Case %d: ",++kase); if( ans!=-1 && ans==0 ) cout<<lcm<<endl; else cout<<ans<<endl; } return 0; }
HDU 3579 Hello Kiki(模线性方程组)
最新推荐文章于 2018-08-28 00:08:38 发布