【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

 

posted @ 2016-02-02 20:48  拦路雨偏似雪花  阅读(273)  评论(0编辑  收藏  举报