一个菜菜的蜕变之路?

时间是个常数,也是个变数

Poj P2115 C Looooops___exgcd

题目大意:

给出多组数,每组数给出A,B,C,k,问
是否存在一个数x,
使得(A+Cx)mod2k=B
如果有,请求出最小的x。
0x<2k
1k32
0A,B,C<2k

分析:

显然对于一个(A+Cx) mod 2k=B
D=2k
我们可以转化成
A+Cx=Bmod D
然后变成
Cx=BAmod D
则可以转化成Cx+Dy=BA
然后就可以愉悦的用exgcd求出一个通解x0,y0
然后通过计算得出最小的x即可

代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>

using namespace std;

typedef long long LL;

LL exgcd(LL a, LL b, LL &x, LL &y) {
    if (!b) { x = 1; y = 0; return a; }
    LL d = exgcd(b, a % b, x, y);
    LL z = x; x = y;
    y = z - y * (a / b);
    return d;
}

int main(){
    LL a, b, c, k, x, y; 
    while (~scanf("%I64d %I64d %I64d %I64d", &a, &b, &c, &k)) {
           if (!a && !b && !c && !k) break;
           LL modn = (1LL << k);
           b = (b - a + modn) % modn;
           if (!b) printf("0\n");
              else {
                     LL Gcd = exgcd(c, modn, x, y);
                     if (b % Gcd == 0){
                         x *= (b / Gcd);
                         y *= (b / Gcd);
                         LL rp = modn / Gcd;
                         x = (x % rp + rp) % rp;  
                         printf("%I64d\n", x);  
                     } else printf("FOREVER\n");
              }
    }    
    return 0;
}
阅读更多
版权声明:欢迎借鉴,谢绝抄搬。 https://blog.csdn.net/Gx_Man_VIP/article/details/80436534
个人分类: C++ gcd&exgcd
想对作者说点什么? 我来说一句

西工大 poj 100题 中的

2012年06月22日 158B 下载

poj c语言作业啊

2009年12月29日 869KB 下载

C语言Poj答案全完整打包

2012年05月30日 34KB 下载

西工大c语言poj答案

2014年10月14日 341KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭