POJ 1006 Biorhythms

本文介绍了一道关于中国剩余定理的经典算法题目,并提供了一份详细的C++实现代码。该算法通过解决特定数学问题来展示如何应用中国剩余定理求解未知数。

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

http://poj.org/problem?id=1006
https://gist.github.com/yyecust/562016f2cdbe6f0649d23d13b8bd94ba
中国剩余定理模板题

#include <cstdio>
using namespace std;
int nextInt()
{
  int x;
  scanf("%d", &x);
  return x;
}
int extend_gcd(int a, int b, int &x, int &y)
{
  if (b == 0) {
    x = 1;
    y = 0;
    return a;
  } else {
    int r = extend_gcd(b, a % b, y, x);
    y -= x * (a / b);
    return  r;
  }
}
int CRT(int a[], int m[], int n)
{
  int M = 1;
  for (int i = 0; i < n; i++) M*=m[i];
  int ans = 0;
  for (int i = 0; i < n; i++) {
    int x, y;
    int tm = M / m[i];
    extend_gcd(tm, m[i], x, y);
    ans = ans + (tm * x * a[i]) % M;
  }
  return (ans + M) % M;
}
int solve(int p, int e, int i, int d)
{
  int a[3] = {p, e, i};
  int m[3] = {23, 28, 33};
  int M = m[0] * m[1] * m[2];
  int ans = CRT(a, m, 3) - d;
  if (ans <= 0) ans += M;
  return ans;
}
int main()
{
  //freopen("in.txt", "r", stdin);
  int t = 0;
  for (;;) {
    int p = nextInt(), e = nextInt(), i = nextInt(), d = nextInt();
    if (p == -1) break;
    printf("Case %d: the next triple peak occurs in %d days.\n", ++t, solve(p, e, i, d));
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值