poj2115 C Loooooops:http://poj.org/problem?id=2115
其实就是解不定方程哇 Ax+By=K
拓展欧几里得算法
给出A和B,求它们的最大公约数,并且求出x和y,满足Ax+By=gcd(A,B)。
通俗的说就是x个A+y个B等于K
当A=0时,x=0,y=1;(一定)
当A>0时,
因为 exgcd ( A , B , x , y ) 表示 Ax+By=gcd( A , B )
而且 exgcd ( B%A , A , tx , ty )表示 B%A * tx + A*ty = gcd( B%A ,A )
又 gcd ( A , B ) == gcd( B%A , A ), 所以 B%A * tx + A*ty ==Ax+By
以上过程需要大家手动推一推~
代码~~
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
LL exgcd(LL a,LL b,LL &x,LL &y)//拓展欧几里得算法
{
if (a==0)
{
x=0;y=1;
return b;
}
else
{
LL tx,ty;
LL d=exgcd(b%a,a,tx,ty);
x=ty-(b/a)*tx;
y=tx;
return d;
}
}
int main()
{
LL A,B,K,a,b,c,d,k,x,y;
scanf("%lld%lld%lld%lld",&a,&b,&c,&k);
while (a!=0||b!=0||c!=0||k!=0)
{
A=c;B=1LL<<k;K=b-a;
d=exgcd(A,B,x,y);
if (K%d!=0) printf("FOREVER\n");
else
{
printf("%lld\n",((x*K/d)%(B/d)+(B/d))%(B/d));
}
scanf("%lld%lld%lld%lld",&a,&b,&c,&k);
}
return 0;
}