Advertisement
Guest User

manasa_and_combinatorics_xorfire

a guest
Apr 30th, 2014
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.40 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4.  
  5. long long pwr(long long a, long long b, long long md)
  6. {
  7.     long long ret = !b ? 1 : pwr(a, b >> 1, md);
  8.     return ret * ret % md * (b & 1 ? (a % md) : 1) % md;
  9. }
  10.  
  11. int valu(long long n, long long p)
  12. {
  13.     int ct = 0;
  14.     for(long long pp = p; n >= pp; ct += n / pp, pp *= p);
  15.     return ct;
  16. }
  17.  
  18. long long go(long long n, long long p)
  19. {
  20.     if(n <= 1) return 1;
  21.     long long q = n / p, r = n % p;
  22.     long long ret = (q & 1) ? (p-1) : 1;
  23.     for(int i = 2; i <= r; ++i) ret = ret * i % p;
  24.     return ret * go(q, p) % p;
  25. }
  26.  
  27. int main()
  28. {
  29.     int t; cin >> t;
  30.     while(t--)
  31.     {
  32.         long long n; cin >> n;
  33.         if(n <= 5)
  34.         {
  35.             int ret[] = {0, 1, 4, 21, 121, 728};
  36.             cout << ret[n] << '\n';
  37.             continue;
  38.         }
  39.  
  40.         long long p = 99991, c = valu(3 * n, p);
  41.         c -= valu(n - 1, p) + valu(2 * n + 1, p);
  42.  
  43.         long long m = n % p;
  44.         c += ((m * m + m + 2) % p == 0);
  45.         m = n;
  46.         while(m % p == 0) m /= p, --c;
  47.         m = n + 1;
  48.         while(m % p == 0) m /= p, --c;
  49.  
  50.         if(c > 0) { puts("0"); continue; }
  51.         m = n % p, m = (3 * m * m + 3 * m + 6) % p;
  52.  
  53.         long long num = m * go(3 * n - 1, p) % p;
  54.         long long den = go(2 * n + 2, p) * go(n-1, p) % p;
  55.         cout << num * pwr(den, p-2, p) % p << '\n';
  56.     }
  57.     return 0;
  58. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement