Biorhythms(中国剩余定理的应用)

题目大意:

人的激素,情感,和智商分别由三个不同的周期,在周期的最后一天达到顶峰,三个周期分别是23,28,33.

现在给你三个周期上一次达到顶峰的时间批p,e,i,和当前的时间d要你求还有多少天后三个周期同时达到顶峰;

解题思路:

假设还有x天;

    则:(x+d)%p=23、(x+d)%e=28、(x+d)%i=33;一看这部就是中国剩余定理了吗;

    so!!!!上个代码,不知都神马是中国剩余定理的先看我的上一篇中国剩余定理

#include<stdio.h>
int m[4]={0,23,28,33},M,a[4],gcd[4];
void exgcd(int a,int b,int &d,int &x,int &y){
    if(b==0){
        x=1;
        y=0;
        d=a;
        return ;
    }else{
       exgcd(b,a%b,d,x,y);
       int temp=x;
           x=y;
           y=temp-(a/b)*y;

    }
}
void initi(int r){
    M=1;
    int i,Mi,x,y,d;
    for(i=1;i<=r;i++)
               M*=m[i];
    for(i=1;i<=r;i++){
        Mi=M/m[i];
        exgcd(Mi,m[i],d,x,y);
        gcd[i]=Mi*x;
      }
}
int china(int r){
    int ans=0,i;
    for(i=1;i<=r;i++){
            ans=(ans+gcd[i]*a[i])%M;
    }
    if(ans<0)
        ans+=M;
  return ans;
}
int main()
{
    int p,e,i,d,temp,ans;
    initi(3);
    while(scanf("%d%d%d%d",&p,&e,&i,&d)!=EOF){
        if(p==-1&&e==-1&&i==-1&&d==-1)
                                   break;
         a[1]=p,a[2]=e,a[3]=i;
         ans=china(3);
         while(ans<=d)
            ans+=M;
         printf("%d\n",ans-d);
 
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值