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

POJ2115 C Looooops(线性同余方程)

时间:2016-02-03 20:01:31      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:

无符号k位数溢出就相当于mod 2k,然后设循环x次A等于B,就可以列出方程:

$$ Cx+A \equiv B \pmod {2^k} $$ $$ Cx \equiv B-A \pmod {2^k} $$

最后就用扩展欧几里得算法求出这个线性同余方程的最小非负整数解。

 1 #include<cstdio>
 2 #include<cstring>
 3 #define mod(x,y) (((x)%(y)+(y))%(y))
 4 #define ll long long
 5 ll exgcd(ll a,ll b,ll &x,ll &y){
 6     if(b==0){
 7         x=1; y=0;
 8         return a;
 9     }
10     ll d=exgcd(b,a%b,x,y);
11     ll t=y;
12     y=x-a/b*y;
13     x=t;
14     return d;
15 }
16 ll MLES(ll a,ll b,ll n){
17     ll x,y;
18     ll d=exgcd(a,n,x,y);
19     if(b%d) return -1;
20     return mod(x*(b/d),n/d);
21 }
22 int main(){
23     ll a,b,c,k;
24     while(~scanf("%lld%lld%lld%lld",&a,&b,&c,&k) && (a||b||c||k)){
25         k=1LL<<k;
26         ll res=MLES(c,b-a,k);
27         if(res==-1) puts("FOREVER");
28         else printf("%lld\n",res);
29     }
30     return 0;
31 }

 

POJ2115 C Looooops(线性同余方程)

标签:

原文地址:http://www.cnblogs.com/WABoss/p/5180434.html

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