POJ2115 扩展欧几里得

来源:互联网 发布:大数据舆情分析 编辑:程序博客网 时间:2024/05/18 00:45

扩展欧几里得模板题 根据题意理出二元一次方程 A+X*C-B=Y*2^k 移项可得X*C+Y*2^k=B-A 

然后扩展欧几里得 就得出答案了

#include <iostream>#include<cstdio>#include<cstring>using namespace std;void exgcd(long long a,long long b,long long &d,long long &x,long long &y){    if(b==0)    {        x=1;        y=0;        d=a;        return;    }    else    {        exgcd(b,a%b,d,x,y);        long long temp=x;        x=y;        y=temp-(a/b)*y;    }}int main(){    long long a,b,c,k,m[35],gc,x,y;    m[1]=2;    for(int i=2; i<=32; i++)        m[i]=2*m[i-1];    while(~scanf("%lld%lld%lld%lld",&a,&b,&c,&k)&&(a+b+c+k))    {        exgcd(c,m[k],gc,x,y);        if((b-a)%gc==0)        {            x*=((b-a)/gc);            x=(x%(m[k]/gc)+m[k]/gc)%(m[k]/gc);            printf("%lld\n",x);        }        else            printf("FOREVER\n");    }    return 0;}


原创粉丝点击