POJ 1006 Biorhythms
题解:中国剩余定理
通解:ans=a[i]*M[i]*Inv(M[i],m[i])+k*M
注意window与linux下读入输出差异
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long Lint;
int T;
Lint b;
Lint m[4]={0,23,28,33};
Lint a[4];
Lint M;
Lint ans;
Lint Gcd(Lint a,Lint b){
if(b==0)return a;
return Gcd(b,a%b);
}
Lint Inv(Lint x,Lint p){
int k=0;
for(int i=1;i<=p;++i)if(Gcd(i,p)==1)++k;
Lint ret=1;
k--;
for(;k;k>>=1,x=x*x%p){
if(k&1)ret=ret*x%p;
}
return ret;
}
int main(){
M=m[1]*m[2]*m[3];
while(scanf("%lld%lld%lld%lld",&a[1],&a[2],&a[3],&b)){
++T;
if(a[1]==-1)return 0;
ans=0;
for(int i=1;i<=3;++i){
ans=(ans+a[i]*(M/m[i])*Inv(M/m[i],m[i]))%M;
}
ans=(ans-b+M)%M;
if(ans==0)ans=M;
printf("Case %d: the next triple peak occurs in %lld days.\n",T,ans);
}
}
致歉:笔者已经意识到这是一篇几乎没有价值的文章,给您的阅读带来不好的体验,并且干扰了您的搜索环境,非常抱歉!

浙公网安备 33010602011771号