Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #define P 1000000007
- #define ll long long
- using namespace std;
- ll n, k, suma, i, j, sol, y, numarator, numitor;
- void gcd(ll &x, ll &y, ll a, ll b)
- {
- if (!b)
- x = 1, y = 0;
- else
- {
- gcd(x, y, b, a % b);
- ll aux = x;
- x = y;
- y = aux - y * (a / b);
- }
- }
- ll invers(ll x)
- {
- ll ins, inv = 0;
- gcd(inv, ins, x, P);
- if (inv <= 0)
- inv = P + inv % P;
- return inv;
- }
- ll pu(ll b, ll e)
- {
- if(e == 0) return 1;
- else
- if(e % 2 == 0)
- {
- ll x = pu(b,e / 2);
- return (x * x) % P;
- }
- else return (b * pu(b,e-1)) % P;
- }
- int main()
- {
- cin >> n >> k;
- if(n <= 100000)
- {
- sol = 0;
- for(i = 1; i <= n; i++)
- sol = (sol + pu(i,k)) % P;
- }
- else
- {
- suma = 1;
- numarator = 1;
- numitor = 1;
- for(i = 2; i <= k+2; i++)
- {
- numarator = (numarator*(n-i)) % P;
- numitor = (numitor*(1-i)) % P;
- }
- if(numitor < 0) numitor += P;
- sol = (numarator*invers(numitor)) % P;
- for(i = 2; i <= k+2; i++)
- {
- suma = (suma + pu(i,k)) % P;
- numarator = (numarator*(n-i+1)) % P;
- numarator = (numarator*invers(n-i)) % P;
- numitor = (numitor*(i-1)) % P;
- numitor = (-numitor*invers(k+3-i)) % P;
- if(numitor < 0) numitor += P;
- y = (numarator*invers(numitor)) % P;
- sol = (sol + suma * y) % P;
- }
- }
- cout << sol;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement