码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-02-02 21:35:54      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:

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】拓展欧几里得-不定方程

标签:

原文地址:http://www.cnblogs.com/KonjakJuruo/p/5178503.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!