POJ - 2115 C Looooops Posted on 2018-01-30 | In 算法 , 数论 , 扩展欧几里得 思路构造线性方程cx+2^k*y=b-a,直接extgcd即可,注意对线性方程有通解计算公式:x1=x0+k*b/(gcd(a,b)),y1=y0-k*a/(gcd(a,b))。 代码1234567891011121314151617181920212223242526272829303132#include <cstdio>#define ll long long#define INF 0x7fffffff#define ms(a,val) memset((a),(val),(sizeof(a)))using namespace std;ll extgcd(ll a,ll b,ll &x,ll &y){ ll d=a; if(b){ d=extgcd(b,a%b,y,x); y-=(a/b)*x; } else{ x=1,y=0; } return d;}int main() { ll a,b,c,k; while(~scanf("%I64d%I64d%I64d%I64d",&a,&b,&c,&k)){ if(!a&&!b&&!c&&!k)break; ll x,y; ll tgcd=extgcd(c,(1ll<<k),x,y); if((b-a)%tgcd)printf("FOREVER\n"); else{ ll B=(1ll<<k)/tgcd,C=(b-a)/tgcd; printf("%lld\n",((x%B*C%B+B)%B)); } } return 0;}