poj 1006(中国剩余定理+模板题)

题意:人自出生起就有体力,情感和智力三个生理周期,分别为23,28和33天。一个周期内有一天为峰值,在这一天,人在对应的方面(体力,情感或智力)表现最好。通常这三个周期的峰值不会是同一天。现在给出三个日期,分别对应于体力,情感,智力出现峰值的日期。然后再给出一个起始日期,要求从这一天开始,算出最少再过多少天后三个峰值同时出现。

设第x天同时出现,则x%23=p%23,x%28=i%28...(等于p,i也是可以的,计算中会mod),然后用x-d即可,因为x可能小于d,所以加上23*28*33再对这个数取模。

 1 #include<iostream>
 2 #include<string.h>
 3 #include<string>
 4 #include<sstream>
 5 #include<vector>
 6 #include<deque>
 7 #include<map>
 8 #include<algorithm>
 9 #include<iomanip>
10 #include<math.h>
11 #include<set>
12 using namespace std;
13
14 typedef long long ll;
15 typedef unsigned long long ull;
16 const int mod = 1000000007;
17
18 //扩展欧几里得求逆元
19 ll exgcd(ll &x,ll &y,ll a,ll b)
20 {
21     if (b == 0)
22     {
23         x = 1;
24         y = 0;
25         return a;
26     }
27     ll r = exgcd(x, y, b, a%b);
28     ll temp = x;
29     x = y;
30     y = temp - a / b * y;
31     return r;
32 }
33
34 ll inv(ll a,ll b)
35 {
36     ll x, y;
37     ll g = exgcd(x, y, a, b);
38     if (g == 1)
39     {
40         return (x%b + b) % b;
41     }
42     else
43         return -1;
44 }
45
46 ll china(ll *n, ll *m,ll len)
47 {
48     ll M = 1;
49     ll res = 0;
50     for (int i = 0; i < len; i++)
51         M = M * m[i];
52     for (int i = 0; i < len; i++)
53     {
54         ll t = M / m[i];
55         res = (res + t * inv(t, m[i])*n[i]) % M;
56     }
57     return (res+M)%M; //防止res为负数(不太懂)
58 }
59
60 int main()
61 {
62     int cas = 1;
63     int p, e, i, d;
64     ll m[3] = {23,28,33}, n[3];
65     while (cin  >> e >> i >> d>>p && p != -1)
66     {
67         n[0] = e % 23;
68         n[1] = i % 28;
69         n[2] = d % 33;
70         ll  ans = (china(n, m, 3)-p+21252)%21252;
71         ans = ans ? ans : 21252;
72         cout << "Case " << cas++ << ": the next triple peak occurs in " << ans << " days." << endl;
73     }
74     return 0;
75 }

原文地址:https://www.cnblogs.com/QingFengDaHui/p/10392435.html

时间: 2024-10-13 14:41:26

poj 1006(中国剩余定理+模板题)的相关文章

poj 1006:Biorhythms(水题,经典题,中国剩余定理)

Biorhythms Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 110991   Accepted: 34541 Description Some people believe that there are three cycles in a person's life that start the day he or she is born. These three cycles are the physical,

POJ 2891 中国剩余定理(不互素)

Strange Way to Express Integers Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 17877   Accepted: 6021 Description Elina is reading a book written by Rujia Liu, which introduces a strange way to express non-negative integers. The way is

Sliding Window POJ - 2823 单调队列模板题

Sliding Window POJ - 2823 单调队列模板题 题意 给出一个数列 并且给出一个数m 问每个连续的m中的最小\最大值是多少,并输出 思路 使用单调队列来写,拿最小值来举例 要求区间最小值 就是维护一个单调递增的序列 对于样例 8 3 1 3 -1 -3 5 3 6 7 我们先模拟一遍 1.队列为空 1 进队 队列:1 2.3>队尾元素 3 进队 队列: 1 3 3.-1小于队尾元素,一直从尾部出队知道找到比-1小的元素或者队列为空 队列:-1 当队列中元素大于m的时候从队头删

poj1006 ( hdu1370 ):中国剩余定理裸题

裸题,没什么好说的 第一个中国剩余定理 写暴力都过了..可见这题有多水 代码: #include<iostream> #include<stdio.h> #include<math.h> #include<string> #include<map> #include<algorithm> using namespace std; #define MAX 200000000 #define ull unsigned long long

Strange Way to Express Integers POJ 2891(中国剩余定理扩展)

原题 题目链接 题目分析 题意很明确,这里的模数是不互质的,因此不能直接套中国剩余定理.这里稍微讲一下中国剩余定理的扩展,假设前i个方程的特解为ans(i),通解为x(i)=ans(i)+k*lcm(前i个模数).把x(i)代入到第i+1个方程,用扩展欧几里得定理求解k=k0,ans(i+1)=ans(i)+k0*lcm(前i个模数),则x(i+1)=ans(i+1)+lcm(前i+1个模数).大概思路就是这样,但有些细节需要注意一下,求出来的k0,ans(i+1)需要用求模的方法缩小一下. 代

POJ 3041 匈牙利算法模板题

一开始预习是百度的算法 然后学习了一下 然后找到了学长的ppt 又学习了一下.. 发现..居然不一样... 找了模板题试了试..百度的不好用 反正就是wa了..果然还是应当跟着学长混.. 图两边的点分别是行数和列数 每有一个点 就让所处行列连一条边 求最小点覆盖 然后卡住...后来看了增林的博客... 最小点覆盖=最大匹配数 果然是模板题.. 然后wa.. 后来发现是当进行对左边点的遍历的时候 每次都要mem一次vis数组 应该是每次找之前都重新清空啊..不然下次怎么找啊...增光路对点的是否被

POJ 2891 中国剩余定理的非互质形式

中国剩余定理的非互质形式 任意n个表达式一对对处理,故只需处理两个表达式. x = a(mod m) x = b(mod n) km+a = b (mod n) km = (a-b)(mod n) 利用扩展欧几里得算法求出k k = k0(mod n/(n,m)) = k0 + h*n/(n,m) x = km+a = k0*m+a+h*n*m/(n,m) = k0*m+a (mod n*m/(n,m)) #include <cstdio> #include <cstring> #

2014鞍山网络预选赛1006(LCT模板题)hdu5002

Tree Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 41    Accepted Submission(s): 10 Problem Description You are given a tree with N nodes which are numbered by integers 1..N. Each node is as

POJ - 1113 Wall (凸包模板题)

原题链接 模板题,直接说思路. 思路: 要求一距离凸包为 L 的图形的周长,即为 凸包周长+L为半径的圆周长 ,直接用 Graham 求一次凸包即可. 1 /* 2 * @Author: windystreet 3 * @Date: 2018-08-02 20:41:25 4 * @Last Modified by: windystreet 5 * @Last Modified time: 2018-08-02 22:30:59 6 */ 7 #include <stdio.h> 8 #inc