POJ 1006-Biorhythms(CRT)

51 篇文章 0 订阅

题意:人自出生起就有体力,情感和智力三个生理周期,分别为23,28和33天。一个周期内有一天为峰值,在这一天,人在对应的方面(体力,情感或智力)表现最好。通常这三个周期的峰值不会是同一天。现在给出三个日期,分别对应于体力,情感,智力出现峰值的日期。然后再给出一个起始日期,要求从这一天开始,算出最少 再过多少天后三个峰值同时出现。
思路:中国剩余定理(CRT)的互质板子题。
对于中国剩余定理的表述:
设m1,m2,m3….mk两两互素,则同余方程组
这里写图片描述
有整数解。并且在模M=m1*m2*……*mk下的解是唯一的,解为:
这里写图片描述
其中Mi=M/m[i],而Mi^-1为Mi模m[i]的逆元。

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
using namespace std;
typedef __int64 LL;
void exgcd(int a,int b,int &x,int &y)
{
    if(b==0){
        x=1;y=0;
        return ;
    }
    exgcd(b,a%b,x,y);
    int t=x;
    x=y;
    y=t-(a/b)*y;
}
int CRT(int a[],int m[],int n)
{
    int M=1;
    int ans=0;
    for(int i=1;i<=n;i++){
        M*=m[i];
    }
    for(int i=1;i<=n;i++){
        int x,y;
        int Mi=M/m[i];
        exgcd(Mi,m[i],x,y);
        ans=(ans+Mi*x*a[i])%M;
    }
    if(ans<0) ans+=M;
    return ans;
}
int main()
{
    int p,e,i,d;
    int a[4],m[4];
    int icase=1;
    while(~scanf("%d %d %d %d",&p,&e,&i,&d)){
        if(p==-1&&e==-1&&i==-1&&d==-1) break;
        a[1]=p;a[2]=e;a[3]=i;
        m[1]=23;m[2]=28;m[3]=33;
        int ans=CRT(a,m,3);
        if(ans<=d) ans+=21252;
        printf("Case %d: the next triple peak occurs in %d days.\n",icase,ans-d);
    }
    return 0
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rocky0429

一块也是爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值