您的位置:首页 > 其它

POJ 1006 Biorhythms 中国剩余定理

2016-12-07 22:45 405 查看
题目链接:http://poj.org/problem?id=1006

直接套板子

代码:

//#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
using namespace std;
int A[10],B[10];

//扩展欧几里得算法
int Extended_Euclid(int a,int b,int &x,int &y){
int d;
if(b == 0){
x = 1,y = 0;
return a;
}
d = Extended_Euclid(b,a % b,y,x);
y -= a / b * x;
return d;
}

//中国剩余定理
int CRT(int A[],int B[],int n){
int m = 1,ans = 0;
for(int i = 0;i < n;++i)
m = m * B[i];
for(int i = 0;i < n;++i){
int x,y;
int Mi = m / B[i];
Extended_Euclid(Mi,B[i],x,y);
ans = (ans + Mi * x * A[i]) % m;
}
if(ans <= 0) ans += m;
return ans;
}
int main(){
int x = 23,y = 28,z = 33;
int tmp,a,b,c,d,ca = 0;
//    scanf("%d",&tmp);
while(scanf("%d %d %d %d",&a,&b,&c,&d) != EOF){
if(a == -1 && b == -1 && c == -1 && d == -1) break;
B[0] = 23,B[1] = 28,B[2] = 33;
A[0] = (a - d + B[0]) % B[0];
A[1] = (b - d + B[1]) % B[1];
A[2] = (c - d + B[2]) % B[2];
printf("Case %d: the next triple peak occurs in %d days.\n",++ca,CRT(A,B,3));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: