Advertisement
Guest User

Untitled

a guest
Feb 29th, 2012
361
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.27 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <map>
  4. using namespace std;
  5. vector<int> prime;
  6. vector<char> mark;
  7. void sieve()
  8. {
  9.     mark.assign(257,0);
  10.     for (int i = 2; i <= 256; i++)
  11.     {
  12.         if(mark[i] == 0)
  13.         {
  14.             prime.push_back(i);
  15.             for (int j = i * i; j <= 256; j += i)
  16.             {
  17.                 mark[j] = 1;
  18.             }
  19.         }
  20.     }
  21. }
  22. long long binpow(long long a,long long n,long long m)
  23. {
  24.     long long r = 1;
  25.     while(n)
  26.     {
  27.         if(n & 1){  r *= a; r %= m; }
  28.         a *= a;
  29.         a %= m;
  30.         n >>= 1;
  31.     }
  32.     return r;
  33. }
  34. int di[50] = {0};
  35. int fact(int p)
  36. {
  37.     int cnt = 0;
  38.     for (int i = 0; i < prime.size(); i++)
  39.     {
  40.         if(prime[i] >= p)
  41.             break;
  42.         if(p % prime[i] == 0)
  43.         {
  44.             di[cnt] = prime[i];
  45.             cnt++;
  46.             while(p % prime[i] == 0)
  47.             {
  48.                 p /= prime[i];
  49.             }
  50.         }
  51.     }
  52.     if(p > 1)
  53.     {
  54.         di[cnt] = p;
  55.         cnt++;
  56.     }
  57.     return cnt;
  58. }
  59. int main()
  60. {
  61.     //freopen ("input.txt","r",stdin);
  62.     sieve();
  63.     int k;
  64.     cin >> k;
  65.     for (int i = 0; i < k; i++)
  66.     {
  67.         int n;
  68.         scanf ("%d",&n);
  69.         int mx = -1;
  70.         int id = -1;
  71.         int phi = n - 1;
  72.         int cnt = fact(phi);
  73.         for (int res = n - 1; res >= 2; --res)
  74.         {
  75.             bool ok = true;
  76.             for (int i = 0; i < cnt && ok; ++i)
  77.                 ok &= binpow(res,phi / di[i],n) != 1;
  78.             if(ok)
  79.             {
  80.                 id = res;
  81.                 break;
  82.             }
  83.         }
  84.         printf ("%d\n",id);
  85.     }
  86.     return 0;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement