POJ 2115 C Looooops (扩展欧几里德 + 线性同余方程)
分析:这个题主要考察的是对线性同余方程的理解,根据题目中给出的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 (扩展欧几里德 + 线性同余方程)的更多相关文章
- poj 2115 C Looooops 扩展欧几里德
C Looooops Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 23616 Accepted: 6517 Descr ...
- POJ 2115 C Looooops扩展欧几里得
题意不难理解,看了后就能得出下列式子: (A+C*x-B)mod(2^k)=0 即(C*x)mod(2^k)=(B-A)mod(2^k) 利用模线性方程(线性同余方程)即可求解 模板直达车 #incl ...
- 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( ...
- POJ 2115 C Looooops(扩展欧几里得)
辗转相除法(欧几里得算法) 时间复杂度:在O(logmax(a, b))以内 int gcd(int a, int b) { if (b == 0) return a; return gcd(b, a ...
- poj 2115 C Looooops(扩展gcd)
题目链接 这个题犯了两个小错误,感觉没错,结果怒交了20+遍,各种改看别人题解,感觉思路没有错误,就是wa. 后来看diccuss和自己查错,发现自己的ecgcd里的x*(a/b)写成了x*a/b.还 ...
- POJ - 2115 C Looooops(扩展欧几里德求解模线性方程(线性同余方程))
d.对于这个循环, for (variable = A; variable != B; variable += C) statement; 给出A,B,C,求在k位存储系统下的循环次数. 例如k=4时 ...
- POJ2115:C Looooops(一元线性同余方程)
题目: http://poj.org/problem?id=2115 要求: 会求最优解,会求这d个解,即(x+(i-1)*b/d)modm;(看最后那个博客的链接地址) 前两天用二元一次线性方程解过 ...
- poj2115-C Looooops(扩展欧几里德算法)
本题和poj1061青蛙问题同属一类,都运用到扩展欧几里德算法,可以参考poj1061,解题思路步骤基本都一样.一,题意: 对于for(i=A ; i!=B ;i+=C)循环语句,问在k位存储系统中循 ...
- POJ2115 C Looooops 扩展欧几里德
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ2115 题意 对于C的for(i=A ; i!=B ;i +=C)循环语句,问在k位存储系统中循环几次 ...
随机推荐
- 第二次冲刺spring会议(第三次会议)
[例会时间]2014/5/6 21:15 [例会地点]9#446 [例会形式]轮流发言 [例会主持]马翔 [例会记录]兰梦 小组成员:兰梦 ,马翔,李金吉,赵天,胡佳奇
- 洛谷-烤鸡-BOSS战-入门综合练习1
题目背景 Background 猪猪hanke得到了一只鸡 题目描述 Description 猪猪Hanke特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke吃鸡很特别,为什么特别呢?因为他有10 ...
- Openjudge-计算概论(A)-求出e的值
描述: 利用公式e = 1 + 1/1! + 1/2! + 1/3! + ... + 1/n! 求e .输入输入只有一行,该行包含一个整数n(2<=n<=15),表示计算e时累加到1/n! ...
- sql分页比较简单快捷的方法
SELECT TOP 显示数量* FROM 表 WHERE (主键id>(SELECT MAX(主键id) FROM(SELECT TOP 页码数*显示数量 主键id FROM 表 ORDER ...
- 斯坦福大学公开课:iOS 7应用开发 笔记
2015-07-06 第一讲 课务.iOS概述 -------------------------------------------------- 开始学习斯坦福大学公开课:iOS 7应用开发留 ...
- Deep Learning(深度学习)网络资源
Deep Learning(深度学习) ufldl的2个教程(这个没得说,入门绝对的好教程,Ng的,逻辑清晰有练习):一 ufldl的2个教程(这个没得说,入门绝对的好教程,Ng的,逻辑清晰有练习): ...
- php 过滤emoji表情
function yz_expression() { foreach ($_POST as $key => &$value) { $value = preg_replace_callba ...
- php第二季
1.百度编辑器uEditor,新浪编辑器SinaEditor 2.要防止sql注入 3.人才培养 三级菜单一起显示出来 4.堆栈柱状图 5.弹性菜单,即菜单可编辑
- hdu_2243_考研路茫茫——单词情结(AC自动机+矩阵)
题目链接:hdu_2243_考研路茫茫——单词情结 题意: 让你求包含这些模式串并且长度不小于L的单词种类 题解: 这题是poj2788的升级版,没做过的强烈建议先做那题. 我们用poj2778的方法 ...
- BFS and Queue
BFS (Bridth First Search) can be implemented by a queue. Procedure is like this: (Q is Queue) 1, Put ...