POJ C Looooops

来源:互联网 发布:染色体分析软件 编辑:程序博客网 时间:2024/06/06 14:14

a*x和b同余N时,当b为gcd(a,N)的倍数时有整数解,设x0 = ex_gcd(a,N,b),可得符合条件的x的集合为:x0+k*n'(n' = N / gcd(a,N));

题目很简单,其实就是用欧拉定理求一下逆元即可,注意求出的逆元可能不是最小正整数。需要用公式求一下最小正整数即可。

#include<cstdio>#include<cstring>#include<algorithm>#define ll __int64using namespace std;ll N;void ex_gcd(ll a, ll b, ll&d, ll& x, ll& y){          if (b == 0){          d = a;          x = 1;          y = 0;          return;      }      ex_gcd(b,a%b,d,y,x);      y -= (a/b)*x;  }  ll gcd;bool mark;    ll modular(ll a, ll b){      ll x, y, d;      ex_gcd(a,N,d,x,y);gcd = d;      if (b % d == 0){          x = (x* (b/d)) % N ;               x = (x + N) % (N/d);mark = true;                 return x;       }      return -N;  }  int main(){ll a,b,c,k;while (scanf("%I64d%I64d%I64d%I64d",&a,&b,&c,&k) && !(a==0 && b==0 && c==0 && k==0)){N = (1LL<<k);b = (b-a+N ) % N;mark = false;ll ans = modular(c,b);if (!mark){printf("FOREVER\n");}else{ll t = N / gcd;if (ans < 0){ans = ans + t*((ans / t) + (ans % t == 0 ? 0 : 1));}if (ans -t > 0){ans = ans - t*(ans / t);}printf("%I64d\n",(ans+N) % N);}}return 0;}


0 0
原创粉丝点击