zoukankan      html  css  js  c++  java
  • HDOJ 1370 中国剩余定理

    链接:

    http://acm.split.hdu.edu.cn/showproblem.php?pid=1370

    题意:

    有3个循环周期,周期天数分别为23、28、33。对于某一年,已知某年这3个周期的某一峰值分别是当年的第p、e、i天,

    问从第d天开始到最近一个满足3个周期都达到峰值的日期还有多少天。

    题解:

    直接套中国剩余定理就行了

    代码:

    31 int extgcd(int a, int b, int &x, int &y) {
    32     int d = a;
    33     if (b) d = extgcd(b, a%b, y, x), y -= (a / b) * x;
    34     else  x = 1, y = 0;
    35     return d;
    36 }
    37 
    38 int Chinese_Remainder(int a[], int w[], int len) //中国剩余定理 a[]存放余数  w[]存放两两互质的数  
    39 {
    40     int i, d, x, y, m, n, ret;
    41     ret = 0;
    42     n = 1;
    43     for (i = 0; i<len; i++) n *= w[i];
    44     for (i = 0; i<len; i++){
    45         m = n / w[i];
    46         d = extgcd(w[i], m, x, y);
    47         ret = (ret + y*m*a[i]) % n;
    48     }
    49     return (n + ret%n) % n;
    50 }
    51 
    52 int main() {
    53     ios::sync_with_stdio(false), cin.tie(0);
    54     int w[15] = { 23,28,33 }, a[15];
    55     int cas;
    56     cin >> cas;
    57     int d;
    58     while (cin >> a[0] >> a[1] >> a[2] >> d) {
    59         if (a[0] == -1) break;
    60         a[0] %= 23;
    61         a[1] %= 28;
    62         a[2] %= 33;
    63         int ans = Chinese_Remainder(a, w, 3);
    64         ans -= d;
    65         if (ans <= 0) ans += 23 * 28 * 33;
    66         cout << "Case " << cas++ << ": the next triple peak occurs in " << ans << " days." << endl;
    67     }
    68     return 0;
    69 }
  • 相关阅读:
    使用yield实现一个协成
    串讲-Python基础练习
    Linux练习
    列表生成式
    Jupyter Notebook的快捷键帮助文档
    mysql字段类型
    爬取12306火车票信息
    【Lodop】02 C-Lodop手册阅读上手
    【Lodop】01 Lodop手册阅读上手
    【Redis】06 事务
  • 原文地址:https://www.cnblogs.com/baocong/p/7620507.html
Copyright © 2011-2022 走看看