Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <string.h>
- using namespace std;
- long long mod = 1e9 + 7;
- int gcd (int a, int b, int & x, int & y) {
- if (a == 0) {
- x = 0; y = 1;
- return b;
- }
- int x1, y1;
- int d = gcd (b%a, a, x1, y1);
- x = y1 - (b / a) * x1;
- y = x1;
- return d;
- }
- int powm (long long a,int n)
- {
- int r = 1;
- while(n)
- {
- if (n & 1)
- {
- r = (r * 1ll * a) % mod;
- }
- a = (a * 1ll * a) % mod;
- n >>= 1;
- }
- return r;
- }
- int fact[1002];
- int Cnm[1002][1002] = {0};
- int C(int n,int k)
- {
- return Cnm[n][k];
- int res = fact[n];
- int x, y;
- gcd ((fact[n - k] * 1ll * fact[k]) % mod, mod, x, y);
- x = (x % mod + mod) % mod;
- res = (res * 1ll * x) % mod;
- return res;
- }
- int k;
- int pr;
- long long n,R;
- int dp[1002] = {0};
- int f(int k)
- {
- if (dp[k] != -1)
- return dp[k];
- int sum = 0;
- for (int t = 1; t <= k; t++)
- {
- sum += (C(k,t) * 1ll * f(k - t)) % mod;
- sum %= mod;
- }
- int dl = ((powm((n + 1) % mod,k) * 1ll * powm(R % mod,n % (mod - 1))) % mod + (mod - 1)) % mod;
- dl = (dl % mod + mod) % mod;
- dl = (dl + mod - sum) % mod;
- dl = (dl * 1ll * (R % mod)) % mod;
- int x,y;
- int dv = (R - 1) % mod;
- gcd (dv, mod, x, y);
- x = (x % mod + mod) % mod;
- return dp[k] = (dl * 1ll * x) % mod;
- }
- int main()
- {
- for (int i = 0; i <= 1001; i++)
- {
- for (int j = 0; j <= i; j++)
- {
- Cnm[i][j] = (i == j ? 1 : (j == 0) ? 1 : ((Cnm[i - 1][j] + Cnm[i - 1][j - 1]) % mod));
- }
- }
- fact[0] = 1;
- for (int i = 1; i <= 1001; i++)
- {
- fact[i] = (fact[i - 1] * 1ll * i) % mod;
- }
- int t;
- cin >> t;
- for (int i = 0; i < t; i++)
- {
- memset (dp,255,sizeof dp);
- int k,r;
- cin >> k >> n >> R;
- if (k == 0)
- {
- if (r == 1)
- cout << n << endl;
- else{
- long long ans = powm (R % mod,(n + 1) % (mod - 1)) + (mod - R % mod);
- int dv = (R - 1) % mod;
- int x,y;
- gcd (dv, mod, x, y);
- x = (x % mod + mod) % mod;
- cout << (ans * 1ll * dv) % mod;
- }
- }
- else
- cout << f(k) << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement