题目:http://poj.org/problem?id=1006
用扩展欧几里得算法求逆元,使用中国剩余定理;
本题较简单,可以手算直接写出,不过我仍使用了模板。
代码如下:
#include<iostream> #include<cstdio> using namespace std; int r[5],st,a[5],s,x,y,t;//r为余数,a为除数 int exgcd(int a,int b,int &x,int &y) { if(b==0) { x=1;y=0; return a;//最大公因数 } int gcd=exgcd(b,a%b,x,y); int t=x; x=y; y=t-a/b*y; return gcd; } int main() { a[1]=23;a[2]=28;a[3]=33; int n=23*28*33; while(1) { x=0;y=0;s=0; for(int i=1;i<=3;i++) scanf("%d",&r[i]); scanf("%d",&st); if(r[1]==-1&&r[2]==-1&&r[3]==-1&&st==-1)return 0; for(int i=1;i<=3;i++) { int m=n/a[i]; exgcd(m,a[i],x,y);//x为逆元 s=(s+x*m*r[i])%n; printf("x=%d s=%d\n",x,s); } s-=st; if(s<0||s==0)s+=n; t++; printf("Case %d: the next triple peak occurs in %d days.\n",t,s); } return 0; }