Biorhythms POJ - 1006(中国剩余定理)

Biorhythms

  POJ - 1006 

 题意:

求解一元线性同余方程组。

 1 #include <cstdio>
 2 #include <cstring>
 3 using namespace std;
 4 const int maxn=1010;
 5 int b[maxn],m[maxn];
 6 int n;
 7 void exgcd(int a,int b,int &d,int &x,int &y){
 8     if(!b){d=a;x=1;y=0;}
 9     else {exgcd(b,a%b,d,y,x);y-=x*(a/b);}
10 }
11 //  求解x%m=b
12 int solve(int* b,int* m,int n){
13     int m1=m[0],b1=b[0];;
14     for(int i=1;i<n;i++){
15         int m2=m[i],b2=b[i];
16         int g,x,y;
17         exgcd(m1,m2,g,x,y);
18         int c=b2-b1;
19         if(c%g) return -1;  //无解
20         x=x*(c/g);
21         int r=m2/g;
22         x=(x%r+r)%r;
23         b1+=m1*x;
24         m1*=m2/g;
25         b1%=m1;
26     }
27     return (b1%m1+m1-1)%m1+1;  //返回正整数解
28 }
29 
30 int main(){
31     m[0]=23;m[1]=28;m[2]=33;
32     int kase=0;
33     while(scanf("%d",&b[0])){
34         for(int i=1;i<3;i++) scanf("%d",&b[i]);
35         int x;
36         scanf("%d",&x);
37         if(x==-1) break;
38         int ans=solve(b,m,3);
39         ans=(ans-x+21251)%21252+1;
40         printf("Case %d: the next triple peak occurs in %d days.\n",++kase,ans);
41     }
42 }
View Code

 

还可以用中国剩余定理~

 1 #include <cstdio>
 2 #include <cstring>
 3 using namespace std;
 4 const int maxn=1010;
 5 int b[maxn],m[maxn];
 6 int n;
 7 void exgcd(int a,int b,int &d,int &x,int &y){
 8     if(!b){d=a;x=1;y=0;}
 9     else {exgcd(b,a%b,d,y,x);y-=x*(a/b);}
10 }
11 //  求解x%m[i]=b[i], 其中m互质
12 int china(int* b,int* m,int n){
13     int M=1,ans=0;
14     for(int i=0;i<n;i++) M*=m[i];
15     for(int i=0;i<n;i++){
16         int N=M/m[i];
17         int g,x,y;
18         exgcd(N,m[i],g,x,y);
19         ans=(ans+b[i]*N*x)%M;
20     }
21     return (ans+M)%M;
22 }
23 
24 
25 int main(){
26     m[0]=23;m[1]=28;m[2]=33;
27     int kase=0;
28     while(scanf("%d",&b[0])){
29         for(int i=1;i<3;i++) scanf("%d",&b[i]);
30         int x;
31         scanf("%d",&x);
32         if(x==-1) break;
33         int ans=china(b,m,3);
34         ans=(ans-x+21251)%21252+1;
35         printf("Case %d: the next triple peak occurs in %d days.\n",++kase,ans);
36     }
37 }
View Code

求逆那些算一次就可以了

转载于:https://www.cnblogs.com/yijiull/p/7384178.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值