码迷,mamicode.com
首页 > 其他好文 > 详细

Biorhythms HDU - 1370 (中国剩余定理)

时间:2019-02-24 21:44:20      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:color   mes   namespace   return   pre   include   mat   turn   const   

题目链接:https://cn.vjudge.net/problem/HDU-1370

题目大意:给你三个式子,让你求出满足题目条件的解。

(n-d)%23=p,(n-d)%28=e,(n-d)%33=i。给你d,p,e,i,让你求出n的值,其实把(n-d)看成一个整体,求出来之后再减去d就能求出n了。

中国剩余定理模板也存一下。

m数组是被除数,下标从0开始 m[0]=23,m[1]=28,m[2]=33.

b数组是等号右边的数,下标从0开始,b[0]=p,b[1]=e,b[2]=i。

然后求出的答案是(n-d)的值。

AC代码:

 1 #include<iostream>
 2 #include<stack>
 3 #include<cstring>
 4 #include<iomanip>
 5 #include<stdio.h>
 6 #include<algorithm>
 7 #include<cmath>
 8 #include<queue>
 9 using namespace std;
10 # define ll long long
11 # define inf 1ll<<60
12 const int mod = 21252;
13 const int maxn = 1e3+100;
14 int exgcd(int a,int b,int &x,int &y){
15 int d=a;
16 if(b!=0){
17 d=exgcd(b,a%b,y,x);
18 y-=(a/b)*x;
19 }
20 else {
21 x=1;
22 y=0;
23 }
24 return d;
25 }
26 int china(int m0[],int b[]){
27 int x,y,n,m=1,a=0;
28 for(int j=0;j<3;j++){
29 m=m*m0[j];
30 }
31 for(int j=0;j<3;j++){
32 n=m/m0[j];
33 exgcd(n,m0[j],x,y);
34 a=a+n*b[j]*x;
35 }
36 return a%m;
37 }
38 int main(){
39 int T;
40 int b[15];
41 int p,e,i,d;
42 int Case=0;
43 scanf("%d",&T);
44 while(~scanf("%d%d%d%d",&p,&e,&i,&d)){
45 if(p==-1&&e==-1&&i==-1&&d==-1)break;
46 int m[3]={23,28,33};
47 b[0]=p,b[1]=e,b[2]=i;
48 int sum=china(m,b)-d;
49 if(sum<=0)sum+=mod;
50 printf("Case %d: the next triple peak occurs in %d days.\n",++Case,sum);
51 }
52 return 0;
53 }

 

Biorhythms HDU - 1370 (中国剩余定理)

标签:color   mes   namespace   return   pre   include   mat   turn   const   

原文地址:https://www.cnblogs.com/letlifestop/p/10427856.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!