POJ 1006 Biorhythms(中国剩余定理互质版本)

本文介绍了一种利用中国剩余定理解决同余方程组问题的算法实现,并提供了具体的代码示例。通过扩展欧几里得算法求解模逆元,结合中国剩余定理找出满足特定条件的最小非负整数解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


http://poj.org/problem?id=1006


X mod  a1 = b1

X mod  a2 = b2

……

X mod an = bn


如果所有a之间两两互质,求X


1、HDOJ要用__int64,并且避免几种类型数据混合使用。

2、extend_gcd一定要在CRT前面,因为CRT包含了extend_gcd。同理主函数一定是放在最后的,因为它包含所有子函数。

3、注意一下传数组参数的方法

实参都是a, 形参

1) a[]

2) int* a

4、除去后面的数据特殊处理,ans算出来的是所有满足条件的X中的最小非负整数解

5、a mod b = (a % b + b) % b    %计算出来的可能是负数,取决于a的正负,但是mod算出来的一定是正的。a mod b = r a = b * q + r (b > 0 and 0 <= r < b),r就是满足x mod b = r的最小非负整数 注意 b>0。当a>0时,mod 和 %就无所谓了。

6、如果a mod b = c,那么(a+kb) mod b = c

     如果a mod b = c,那么(a*k) mod b = c

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define LL __int64
using namespace std;
LL n, k, m[100], a[100], T, cnt, D, ans;//模数为m,余数为a, X % m = a
//m互素
LL extend_gcd(LL a, LL b, LL &x, LL &y)
{
    if(a == 0 && b == 0)
        return -1;
    if(b ==0 )
    {
        x = 1;
        y = 0;
        return a;
    }
    LL d = extend_gcd(b,a%b,y,x);
    y -= a/b*x;
    return d;
}
LL CRT(LL a[], LL m[], LL n)
{
    LL M = 1;
    LL ans = 0;
    for(int i = 0; i < n; i++)
        M *= m[i];
    for(int i = 0; i < n; i++)
    {
        LL x, y;
        LL Mi = M / m[i];
        extend_gcd(Mi, m[i], x, y);
        ans = ((ans + Mi * x * a[i]) % M + M) % M;
    }
    ans = ((ans - D) % M + M) % M; 
    ans = ans % 21252;
    if (ans == 0) ans = 21252;
    return ans;
}
int main()
{
    scanf("%I64d", &T);
    m[0] = 23;
    m[1] = 28;
    m[2] = 33;
    while (T--)
    {
        cnt = 0;
        while (~scanf("%I64d%I64d%I64d%I64d", &a[0], &a[1], &a[2], &D) && a[0] != -1)
        {
            cnt++;
            LL ans = CRT(a, m, 3);
            printf("Case %I64d: the next triple peak occurs in %I64d days.\n", cnt, ans);
        }
    }
    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值