pku2115-C Looooops拓展欧几里得-不定方程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pku2115-C Looooops拓展欧几里得-不定方程相关的知识,希望对你有一定的参考价值。

http://poj.org/problem?id=2115

题解:一个变量从A开始加到B,每次加C并mod2^k,问加多少次。转化为不定方程:C*x+2^K*Y=B-A

技术分享
//poj2115

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;

typedef long long LL;
LL bit[40];
LL tx,ty;

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

int main()
{
    //freopen("a.in","r",stdin);
    //freopen("a.out","w",stdout);
    bit[0]=1;
    for(LL i=1;i<=32;i++) bit[i]=bit[i-1]*2;
    LL a,b,c,k;
    while(1)
    {
        scanf("%I64d%I64d%I64d%I64d",&a,&b,&c,&k);
        if(!a && !b && !c && !k) return 0;
        LL A=c,B=bit[k],C=b-a;
        LL g=exgcd(A,B);
        if(C%g) printf("FOREVER\n");
        else 
        {
            LL x=tx*(C/g);
            x=(x%(B/g)+(B/g))%(B/g);
            printf("%I64d\n",x);
        }
    }
    return 0;
}
View Code

 

以上是关于pku2115-C Looooops拓展欧几里得-不定方程的主要内容,如果未能解决你的问题,请参考以下文章

poj2115--C Looooops--扩展欧几里得

POJ2115 C Looooops 扩展欧几里德

POJ2115 C Looooops

POJ 2115 C Looooops(Exgcd)

POJ 2115 C Looooops (扩展欧几里德 + 线性同余方程)

POJ2115 C Looooops(线性同余方程)