Hello Kiki |
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) |
Total Submission(s): 258 Accepted Submission(s): 111 |
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 |
题意:
求同于方程。上模板。
代码:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=100005; const int inf=0x7fffffff; typedef long long ll; void ex_gcd(ll a,ll b,ll &d,ll &x,ll &y)//扩展欧几里得 { if(!b) {d=a;x=1;y=0;} else{ ex_gcd(b,a%b,d,y,x); y-=x*(a/b); } } ll ex_crt(ll *m,ll *r,int n) { ll M=m[1],R=r[1],x,y,d; for(int i=2;i<=n;i++){ ex_gcd(M,m[i],d,x,y); if((r[i]-R)%d) return -1; x=(r[i]-R)/d*x%(m[i]/d); R+=x*M; M=M/d*m[i]; R%=M; } return R>0?R:R+M; } int main() { int t,n; scanf("%d",&t); for(int cas=1;cas<=t;cas++){ scanf("%d",&n); ll m[maxn],r[maxn];//m除数,r余数 for(int i=1;i<=n;i++) scanf("%lld",&m[i]); for(int i=1;i<=n;i++) scanf("%lld",&r[i]); printf("Case %d: %I64d\n",cas,ex_crt(m,r,n)); } return 0; }