poj 1006 中国剩余定理试水

传送门:点击打开链接

题意很好理解,值得注意的是:这是一个结果要求取模的题,因此按照中国剩余定理,结果唯一,需要取模,而这个取模很有讲究,一开始我wa的两次都是由于取模不当导致。

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
using namespace std;
typedef long long ll;
int p, e, i, d;
int M, m1, m2, m3, t1, t2, t3;
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 tmp = x;
    x = y;
    y = tmp - a / b * y;
}
int inverse(int a, int m)
{
    int x, y;
    exgcd(a, m, x, y);
    return x;
}
void init()
{
    M = 23 * 28 * 33;
    m1 = M / 23; m2 = M / 28; m3 = M / 33;
    t1 = inverse(m1, 23); t2 = inverse(m2, 28); t3 = inverse(m3, 33);
}
int sunzi()
{
    int all = m1*t1*p+m2*t2*e+m3*t3*i;
    return all - d;
}
int main()
{
    int kase = 0;
    init();
    while(~scanf("%d%d%d%d", &p, &e, &i, &d))
    {
        if(p==-1&&e==-1&&i==-1&&d==-1)
            break;
        kase++;
        int tmp = sunzi();
        tmp %= M;
        tmp = (tmp + M - 1) % M + 1;//这处是为了防止结果为负,之所以不tmp=(tmp+M)%M,是因为如果tmp=-M,那么tmp=0,错
        printf("Case %d: the next triple peak occurs in %d days.\n", kase, tmp);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值