您的位置:首页 > 其它

中国剩余定理 POJ 1006 Biorhythms

2015-09-16 13:17 405 查看
题目传送门

题意:POJ有中文题面

分析:其实就是求一次同余方程组:(n+d)=p(%23), (n+d)=e(%28), (n+d)=i(%33),套用中国剩余定理模板

代码:

/************************************************
* Author        :Running_Time
* Created Time  :2015/9/15 星期二 16:53:01
* File Name     :POJ_1006.cpp
************************************************/

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std;

#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
ll f
;
int n;

ll multi_mod(ll a, ll b, ll p)    {     //a * b % p
a = (a % p + p) % p;
b = (b % p + p) % p;
ll ret = 0;
while (b)   {
if (b & 1)  {
ret += a;
if (ret >= p)   ret -= p;
}
b >>= 1;
a <<= 1;
if (a >= p) a -= p;
}
return ret;
}

ll ex_GCD(ll a, ll b, ll &x, ll &y) {
if (b == 0) {
x = 1;  y = 0;  return a;
}
ll d = ex_GCD (b, a % b, y, x);
y -= x * (a / b);
return d;
}

ll China(int k, int *b, int *m) {
ll M = 1, x, y, ret = 0;
for (int i=1; i<=k; ++i)    M *= m[i];
for (int i=1; i<=k; ++i)    {
ll w = M / m[i];
ex_GCD (w, m[i], x, y);
ret += b[i] * (x * w % M) % M;
}
return (ret - n + M) % M;
}

int main(void)    {
int b[4], m[4];
m[1] = 23;  m[2] = 28;  m[3] = 33;
int cas = 0;
while (scanf ("%d%d%d%d", &b[1], &b[2], &b[3], &n) == 4)  {
if (b[1] == -1 && b[2] == -1 && b[3] == -1 && n == -1) break;
ll ans = China (3, b, m);
if (ans == 0)   ans = 21252;
printf ("Case %d: the next triple peak occurs in %I64d days.\n", ++cas, ans);
}

return 0;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: