Advertisement
Guest User

Untitled

a guest
Apr 1st, 2014
301
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.98 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string.h>
  4. using namespace std;
  5. long long mod = 1e9 + 7;
  6. int gcd (int a, int b, int & x, int & y) {
  7.     if (a == 0) {
  8.         x = 0; y = 1;
  9.         return b;
  10.     }
  11.     int x1, y1;
  12.     int d = gcd (b%a, a, x1, y1);
  13.     x = y1 - (b / a) * x1;
  14.     y = x1;
  15.     return d;
  16. }
  17. int powm (long long a,int n)
  18. {
  19.     int r = 1;
  20.     while(n)
  21.     {
  22.         if (n & 1)
  23.         {
  24.             r = (r * 1ll * a) % mod;
  25.         }
  26.         a = (a * 1ll * a) % mod;
  27.         n >>= 1;
  28.     }
  29.     return r;
  30. }
  31. int fact[1002];
  32. int Cnm[1002][1002] = {0};
  33. int C(int n,int k)
  34. {
  35.     return Cnm[n][k];
  36.     int res = fact[n];
  37.     int x, y;
  38.     gcd ((fact[n - k] * 1ll * fact[k]) % mod, mod, x, y);
  39.     x = (x % mod + mod) % mod;
  40.     res = (res * 1ll * x) % mod;
  41.     return res;
  42. }
  43. int k;
  44. int pr;
  45. long long n,R;
  46. int dp[1002] = {0};
  47. int f(int k)
  48. {
  49.     if (dp[k] != -1)
  50.         return dp[k];
  51.     int sum = 0;
  52.     for (int t = 1; t <= k; t++)
  53.     {
  54.         sum += (C(k,t) * 1ll * f(k - t)) % mod;
  55.         sum %= mod;
  56.     }
  57.     int dl = ((powm((n + 1) % mod,k) * 1ll * powm(R % mod,n % (mod - 1))) % mod + (mod - 1)) % mod;
  58.     dl = (dl % mod + mod) % mod;
  59.     dl = (dl + mod - sum) % mod;
  60.     dl = (dl * 1ll * (R % mod)) % mod;
  61.     int x,y;
  62.     int dv = (R - 1) % mod;
  63.     gcd (dv, mod, x, y);
  64.     x = (x % mod + mod) % mod;
  65.     return dp[k] = (dl * 1ll * x) % mod;
  66. }
  67. int main()
  68. {
  69.     for (int i = 0; i <= 1001; i++)
  70.     {
  71.         for (int j = 0; j <= i; j++)
  72.         {
  73.             Cnm[i][j] = (i == j ? 1 : (j == 0) ? 1 : ((Cnm[i - 1][j] + Cnm[i - 1][j - 1]) % mod));
  74.         }
  75.     }
  76.     fact[0] = 1;
  77.     for (int i = 1; i <= 1001; i++)
  78.     {
  79.         fact[i] = (fact[i - 1] * 1ll * i)  % mod;
  80.     }
  81.     int t;
  82.     cin >> t;
  83.     for (int i = 0; i < t; i++)
  84.     {
  85.         memset (dp,255,sizeof dp);
  86.         int k,r;
  87.         cin >> k >> n >> R;
  88.         if (k == 0)
  89.         {
  90.             if (r == 1)
  91.                 cout << n << endl;
  92.             else{
  93.                 long long ans = powm (R % mod,(n + 1) % (mod - 1)) + (mod - R % mod);
  94.                 int dv = (R - 1) % mod;
  95.                 int x,y;
  96.                 gcd (dv, mod, x, y);
  97.                 x = (x % mod + mod) % mod;
  98.                 cout << (ans * 1ll * dv) % mod;
  99.             }
  100.         }
  101.         else
  102.             cout << f(k) << endl;
  103.     }
  104.     return 0;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement