辗转相除法(欧几里得算法)

时间复杂度:在O(logmax(a, b))以内

int gcd(int a, int b)
{
if (b == 0) return a;
return gcd(b, a % b);
}

  

扩展欧几里得算法

时间复杂度和欧几里得算法相同

int extgcd(int a, int b, int& x, int& y)
{
int d = a;
if (b != 0) {
d = extgcd(b, a % b, y, x);
y -= (a / b) * x;
} else {
x = 1; y = 0;
}
return d;
}

用于求ax+by=gcd(a,b)整数解,xy返回整数解,extgcd的返回值是ax+by的值。

题目:(A+x*C)%2^k=B 求x整数解。
解析:
x*C=B-A 的在mod(2^k)情况下的整数解
可以转化成x*C+y*(2^k)=B-A的解
通过扩展欧几里得算法求出x1*C+y1*(2^k)=gcd(c,2^k)的解x1,y1,d=x1*C+y1*(2^k)=gcd(c,2^k)
x1*C+y1*(2^k)=(B-A)(gcd(c,2^k)/(B-A))
(A-B)/gcd(c,2^k)*x1*C+(A-B)/gcd(c,2^k)*y1*(2^k)=B-A
x=(A-B)/gcd(c,2^k)*x1
y=(A-B)/gcd(c,2^k)*y1
要求的值为x,x可能是负数,所以要把x变到正整数。通过+(2^k)/d 再%(2^k)/d来变成正数。

#include <cstdio>

long long extgcd(long long a, long long b, long long& x, long long& y)
{
long long d = a;
if (b != 0) {
d = extgcd(b, a % b, y, x);
y -= (a / b) * x;
} else {
x = 1; y = 0;
}
return d;
} int main()
{
long long a, b, c, k;
while (scanf("%lld%lld%lld%lld", &a, &b, &c, &k) != EOF) {
if (a == 0 && b == 0 && c == 0 && k == 0) break;
long long x, y;
long long t = b - a;
long long h = 1LL << k;  //2^k
long long g = extgcd(c, h, x, y);
if (t % g != 0) {      //no solution
printf("FOREVER\n");
continue;
}
x *= t / g;
x = (x % (h / g) + (h / g)) % (h / g);//最小非负整数解
printf("%lld\n", x);
}
return 0;
}

  

												

POJ 2115 C Looooops(扩展欧几里得)的更多相关文章

  1. 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( ...

  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. poj2115 C Looooops——扩展欧几里得

    题目:http://poj.org/problem?id=2115 就是扩展欧几里得呗: 然而忘记除公约数... 代码如下: #include<iostream> #include< ...

  4. C Looooops(扩展欧几里得+模线性方程)

    http://poj.org/problem?id=2115 题意:给出A,B,C和k(k表示变量是在k位机下的无符号整数),判断循环次数,不能终止输出"FOREVER". 即转化 ...

  5. POJ 2142 - The Balance [ 扩展欧几里得 ]

    题意: 给定 a b n找到满足ax+by=n 的x,y 令|x|+|y|最小(等时令a|x|+b|y|最小) 分析: 算法一定是扩展欧几里得. 最小的时候一定是 x 是最小正值 或者 y 是最小正值 ...

  6. POJ - 2115C Looooops 扩展欧几里得(做的少了无法一眼看出)

    题目大意&&分析: for (variable = A; variable != B; variable += C) statement;这个循环式子表示a+c*n(n为整数)==b是 ...

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

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

  8. POJ2115 C Looooops[扩展欧几里得]

    C Looooops Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 24355   Accepted: 6788 Descr ...

  9. C Looooops(扩展欧几里得)

    C Looooops Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20128 Accepted: 5405 Descripti ...

随机推荐

  1. 【welcome-file-list】让默认页生效

    <welcome-file-list> <welcome-file>404.html</welcome-file> <welcome-file>/vie ...

  2. ACM-进阶之路

    ACM进阶计划 ACM队不是为了一场比赛而存在的,为的是队员的整体提高. 大学期间,ACM队队员必须要学好的课程有: l C/C++两种语言 l 高等数学 l 线性代数 l 数据结构 l 离散数学 l ...

  3. 《JavaScript启示录》摘抄

    1.JavaScript预包装的9个原生的对象构造函数: Number(),String(),Boolean(),Object(),Array(),Function(),Data(),RegExp() ...

  4. 网站报错Access denied for user 'root'@'localhost' -问题排查续

    网站报错Access denied for user 'root'@'localhost' (using password: YES) 每次的挽救办法就是: /etc/init.d/mysqld st ...

  5. Autodesk 2014全套密钥

    AUTODESK 2014通用安装序列号: 666-69696969 667-98989898 400-45454545 066-66666666 AUTODESK 2014全系列产品密钥 001F1 ...

  6. Android SurfaceView实现全屏播放例子

    public class Mymedia extends Activity implements OnBufferingUpdateListener, OnCompletionListener, Me ...

  7. 《BackboneJS框架的技巧及模式》(4)完结篇

    <BackboneJS框架的技巧及模式>(4)完结篇 本文紧接第二部分:<BackboneJS框架的技巧及模式(3)> 作者:chszs,转载需注明.博客主页:http://b ...

  8. hdu4714Tree2cycle

    链接 树上的一些操作还是不是太好想 直接dfs下去 不是最优的 一个节点最多保留两个度 如果它有两个以上的子节点 那么就与父节点断开 与k-2个子节点断开 再重新连 #pragma comment(l ...

  9. 使用Visual Studio进行单元测试

    一.使用Visual Studio进行单元测试的几个建议 1.先写单元测试(依我愚见,应该是接口先行,如果有的话) -> 测试失败 -> 以最小的改动(即编写实际代码)使测试通过(而在VS ...

  10. C#如何获取真实IP地址

    大家获取用户IP地址常用的方法是   C# 代码   复制 string IpAddress = ""; if((HttpContext.Current.Request.Serve ...