Hello Kiki |
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) |
Total Submission(s): 247 Accepted Submission(s): 107 |
Problem Description One day I was shopping in the supermarket. There was a cashier counting coins seriously when a little kid running and singing \\\\\\\"门前大桥下游过一群鸭,快来快来 数一数,二四六七八\\\\\\\". And then the cashier put the counted coins back morosely and count again... |
Input The first line is T indicating the number of test cases. |
Output For each case output the least positive integer X which Kiki was counting in the sample output format. If there is no solution then output -1. |
Sample Input 2 2 14 57 5 56 5 19 54 40 24 80 11 2 36 20 76 |
Sample Output Case 1: 341 Case 2: 5996 |
Author digiter (Special Thanks echo) |
Source 2010 ACM-ICPC Multi-University Training Contest(14)——Host by BJTU |
Recommend zhouzeyong |
/* 题意:总共有X个钱,分成Mi分会剩余Ai个,让你求X,如果给出的信息不能求出X输出-1 初步思路:中国剩余定理,以前做过类似的题目,韩信点兵,x=m1*m-1*a1+...+mk*mk-1*ak(mod m) */ #include<bits/stdc++.h> #define ll long long using namespace std; /************************中国剩余定理(不互质模板)*****************************/ void exgcd(ll a,ll b,ll& d,ll& x,ll& y) { if(!b){d=a;x=1;y=0;} else { exgcd(b,a%b,d,y,x); y-=x*(a/b); } } ll gcd(ll a,ll b) { if(!b){return a;} gcd(b,a%b); } ll M[55],A[55]; ll China(int r) { ll dm,i,a,b,x,y,d; ll c,c1,c2; a=M[0]; c1=A[0]; for(i=1; i<r; i++) { b=M[i]; c2=A[i]; exgcd(a,b,d,x,y); c=c2-c1; if(c%d) return -1;//c一定是d的倍数,如果不是,则,肯定无解 dm=b/d; x=((x*(c/d))%dm+dm)%dm;//保证x为最小正数//c/dm是余数,系数扩大余数被 c1=a*x+c1; a=a*dm; } if(c1==0)//余数为0,说明M[]是等比数列。且余数都为0 { c1=1; for(i=0;i<r;i++) c1=c1*M[i]/gcd(c1,M[i]); } return c1; } /************************中国剩余定理(不互质模板)*****************************/ int t,n; int main(){ //freopen("in.txt","r",stdin); scanf("%d",&t); for(int ca=1;ca<=t;ca++){ printf("Case %d: ",ca); scanf("%d",&n); for(int i=0;i<n;i++) scanf("%lld",&M[i]); for(int i=0;i<n;i++) scanf("%lld",&A[i]); printf("%lld\n",China(n)); } return 0; }