分析:这个题主要考察的是对线性同余方程的理解,根据题目中给出的a,b,c,d,不难的出这样的式子,(a+k*c) % (1<<d) = b; 题目要求我们在有解的情况下求出最小的解,我们转化一下形式。

  上式可以用同余方程表示为  a + k*c = (b) % (1<<d)   <-->  k*c = (b-a) % (1<<d)(中间应该是全等号,打不出来…)。这就是我们想要的同余方程,根据我的个人习惯,我把它转化为线性方程的形式。

  -->   c*x + (1<<d)*y = (b-a); 此时就对应了线性方程中的a*x + b*y = c的形式,当且仅当 c % gcd(a,b) == 0时x有解,得到x的一个解以后,我们另x化为(x%mod + mod) % mod的形式,mod = b/gcd(a,b);  这个时候的x范围处于(1,mod-1)之间,正是我们要的最小解。

  注意:注意LL的形式,在(1<<d)的时候,不要忘记改成(1LL << d),否则WA了,我被这里坑了……

  代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define LL long long
/** a + c*k = b % d
-> c*k = (b-a) % d
-> c*x + d*y = k*(b-a);
-> if gcd(c,d) | (b-a);
-> get x = k;
-> else forever.
*/
LL x,y;
LL exgcd(LL a,LL b){
if(!b){
x = ; y = ;
return a;
}
LL gcd = exgcd(b,a%b);
LL tmp = x;
x = y;
y = tmp - a/b * y;
return gcd;
}
int main(){
LL a,b,c,d;
while(~scanf("%I64d %I64d %I64d %I64d",&a,&b,&c,&d)){
if(a+b+c+d == ) break;
d = (1LL<<d);
LL A,B,gcd,C,ans,k,mod;
A = c; B = d; C = (b-a);
gcd = exgcd(A,B);
if(C % gcd != ){
puts("FOREVER");
}
else {
k = C / gcd;
x = k*x;
mod = B / gcd;
ans = (x%mod + mod) % mod;
printf("%I64d\n",ans);
}
}
return ; }

POJ 2115 C Looooops (扩展欧几里德 + 线性同余方程)的更多相关文章

  1. poj 2115 C Looooops 扩展欧几里德

    C Looooops Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 23616   Accepted: 6517 Descr ...

  2. POJ 2115 C Looooops扩展欧几里得

    题意不难理解,看了后就能得出下列式子: (A+C*x-B)mod(2^k)=0 即(C*x)mod(2^k)=(B-A)mod(2^k) 利用模线性方程(线性同余方程)即可求解 模板直达车 #incl ...

  3. POJ 2115 C Looooops(扩展欧几里得应用)

    题目地址:POJ 2115 水题. . 公式非常好推.最直接的公式就是a+n*c==b+m*2^k.然后能够变形为模线性方程的样子,就是 n*c+m*2^k==b-a.即求n*c==(b-a)mod( ...

  4. POJ 2115 C Looooops(扩展欧几里得)

    辗转相除法(欧几里得算法) 时间复杂度:在O(logmax(a, b))以内 int gcd(int a, int b) { if (b == 0) return a; return gcd(b, a ...

  5. poj 2115 C Looooops(扩展gcd)

    题目链接 这个题犯了两个小错误,感觉没错,结果怒交了20+遍,各种改看别人题解,感觉思路没有错误,就是wa. 后来看diccuss和自己查错,发现自己的ecgcd里的x*(a/b)写成了x*a/b.还 ...

  6. POJ - 2115 C Looooops(扩展欧几里德求解模线性方程(线性同余方程))

    d.对于这个循环, for (variable = A; variable != B; variable += C) statement; 给出A,B,C,求在k位存储系统下的循环次数. 例如k=4时 ...

  7. POJ2115:C Looooops(一元线性同余方程)

    题目: http://poj.org/problem?id=2115 要求: 会求最优解,会求这d个解,即(x+(i-1)*b/d)modm;(看最后那个博客的链接地址) 前两天用二元一次线性方程解过 ...

  8. poj2115-C Looooops(扩展欧几里德算法)

    本题和poj1061青蛙问题同属一类,都运用到扩展欧几里德算法,可以参考poj1061,解题思路步骤基本都一样.一,题意: 对于for(i=A ; i!=B ;i+=C)循环语句,问在k位存储系统中循 ...

  9. POJ2115 C Looooops 扩展欧几里德

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ2115 题意 对于C的for(i=A ; i!=B ;i +=C)循环语句,问在k位存储系统中循环几次 ...

随机推荐

  1. LeetCode OJ 78. Subsets

    Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a subset must ...

  2. JQ N级导航

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. SharePoint 2013 列表启用搜索

    转载自:http://www.cnblogs.com/jianyus/p/3470117.html SharePoint 2013列表搜索的设置,只是进行完全爬网,就可以使用.如果开启爬网不是很熟练可 ...

  4. def语句常见错误

    自觉不才,使用def语句时容易出现以下错误, 参考: 习题—25 http://www.2cto.com/shouce/Pythonbbf/ex25.html def add(): print &qu ...

  5. jquery 监听回车提交

    //监听回车提交 $(document).keyup(function(event){ if(event.keyCode ==13){ if ($(".form-1").is(': ...

  6. PHP验证码类

    通过PHP的GD库图像处理内容,设计一个验证码类Vcode.将该类声明在文件vcode.class.php中,并通过面向对象的特性将一些实现的细节封装在该类中.只要在创建对象时,为构造方法提供三个参数 ...

  7. 将网页中的html代码的table保存成word文件

    1.后台代码: string nowtime = DateTime.Now.ToString("yyyy-MM-dd"); Response.Clear(); Response.B ...

  8. jquery-选择checkbox的多种策略

    checkbox属性: var val = $("#checkAll").val();// 获取指定id的复选框的值 var isSelected = $("#check ...

  9. hdu5573 二叉树找规律,二进制相关

    input T 1<=T<=100 n k 1<=n<=1e9  n<=2^k<=2^60 output 从1走到第k层,下一层的数是上一层的数×2或者×2+1,每 ...

  10. Flask -- 路由

    route()装饰器把一个函数绑定到对应的URL(可以是多个)上 @app.route('/') def index(): return 'Index Page' @app.route('/hello ...