POJ 2115 不穿衣服的扩展欧几里得

来源:互联网 发布:农村淘宝app最新版下载 编辑:程序博客网 时间:2024/04/27 13:41

传送门TP


题解:

A+XC=Bmod2k

XC=[(BA+2k)mod2k](mod2k)

XC+Y2k=[(BA+2k)mod2k]

于是令P=(BA+2k)mod2k
解这个方程就可以了


#include<cstring> #include<cstdio>#include<iostream>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;}    else{exgcd(b,a%b,d,y,x);y-=x*(a/b);}}long long gcd(long long x,long long y){    if(y==0) return x;    else     return gcd(y,x%y);}long long A,B,C,K; int main(){    while(scanf("%lld%lld%lld%lld",&A,&B,&C,&K)!=EOF){        if(A==0&&B==0&&C==0&&K==0) break;        long long BASE=1;        for(register int i=1;i<=K;i++)BASE*=2;         long long Y=(B-A+BASE)%BASE;        long long N,D,GCD;        exgcd(C,BASE,GCD,N,D);        if(Y%GCD!=0){printf("FOREVER\n");continue;}        else{            N*=(Y/GCD);BASE=BASE/gcd(C,BASE);            N=(N%BASE+BASE)%BASE;        }        printf("%lld\n",N);    }    return 0;}

这里写图片描述

原创粉丝点击