像扩展欧几里德的题啊,稍微变变形,把什么什么移到左边,什么移到右边,就这样然后套板子即可
注意long long 运算的一些特殊情况
k=1<<k;就wa了
但是改为k=1ll<<k就没事了
这里,我来解释一下:因为位移运算符返回值根据前面的数来定,而一般的整数默认的为int型的,但是只要在数字后面加ll,就变成long long型的了
这样才能保证返回值是正常的
所以这些特殊情况要积累
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll __int64
using namespace std;
ll a,b,c,x,y,k;
void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
{
if (b==0){d=a;x=1;y=0;return ;}
exgcd(b,a%b,d,y,x);y-=x*(a/b);
}
bool bdfc(ll a,ll b,ll c)
{
ll d=0;
exgcd(a,b,d,x,y);
if (c%d) return false;
x=x*c/d;
x=x%(b/d);//不定方程的模版而以
if(x<0)x+=b/d;
return true;
}
int main()
{
while(scanf("%I64d%I64d%I64d%I64d",&a,&b,&c,&k))
{
if (a==0&&b==0&&c==0&&k==0) break;
k=1ll<<k;//注意!!!!
if (bdfc(c,k,b-a))/*推出来套模版即可*/ printf("%I64d\n",x);else printf("FOREVER\n");
}
return 0;
}