POJ1006:Biorhythms

来源:互联网 发布:国家发改委 大数据 编辑:程序博客网 时间:2024/06/05 08:07

POJ1006

有三个周期,分别为23,28,33天。一个周期中有一天为峰值。
给出三个峰值日期,和当前日期,求最少要经过多少天,三个峰值同时出现。

中国剩余定理模板题。

【代码】

#include <cstdio>#include <iostream>#include <algorithm>#define N 2335#define INF 0x7fffffffusing namespace std;typedef long long ll;ll read(){    ll x=0,f=1;char ch=getchar();    while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}    while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}    return x*f;}int ans,M=1,st,Case;int a[4],b[4]={0,23,28,33};void Exgcd(int a,int b,int &x,int &y){    if(b) {        Exgcd(b,a%b,y,x);        y-=(a/b)*x;    }    else x=1,y=0;}int CRT(int a[],int b[],int n){    int x,y,rtn=0;M=1;    for(int i=1;i<=n;i++) M*=b[i];    for(int i=1;i<=n;i++)    {        int mi=M/b[i];        Exgcd(mi,b[i],x,y);        rtn=(rtn+a[i]*mi*x)%M;    }    if(rtn<0) rtn+=M;    return rtn;}int main(){    while(1)    {        for(int i=1;i<=3;i++) a[i]=read();        st=read();if(st==-1) break;        ans=CRT(a,b,3);        if(ans<=st) ans+=21252;        printf("Case %d: the next triple peak occurs in %d days.\n",++Case,ans-st);    }     return 0;}
原创粉丝点击