解法:
exgcd模板题
注意:计算mod时,需要 ,不能
模线性方程Ax=C(mod B) :
void exgcd(ll a,ll b,ll &d,ll &x,ll &y) { if(!b) { d=a; x=1; y=0; } else { exgcd(b,a%b,d,y,x); y-=x*(a/b); } } ll mod_count(ll a,ll c,ll b)//求解模线性方程ax=c(mod b) { ll x,y; ll gcd; exgcd(a,b,gcd,x,y); if(c%gcd)//没有解 return -1; x=(x*(c/gcd))%b;//特解 ll s=b/gcd; x=(x%s+s)%s; //s为最小整数解 return x; }
#include <map> #include <set> #include <cmath> #include <queue> #include <cstdio> #include <vector> #include <climits> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #include<math.h> #define ll long long using namespace std; void exgcd(ll a,ll b,ll &d,ll &x,ll &y) { if(!b) { d=a; x=1; y=0; } else { exgcd(b,a%b,d,y,x); y-=x*(a/b); } } ll a,b,c,k; int main() { while(~scanf("%lld%lld%lld%lld",&a,&b,&c,&k)) { if(a==0&&b==0&&c==0&&k==0) break; ll A,B,C,mod; C=b-a; A=c; B=1ll<<k; ll gcd; ll x,y; exgcd(A,B,gcd,x,y); if(C%gcd) { puts("FOREVER"); continue; } x=x*(C/gcd); // x%=B; ll t=B/gcd; x=(x%t+t)%t;//饱和取模 printf("%lld\n",x); } }
10-06