This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define Loop(x,l,r) for (ll x = (l); x < (ll)(r); ++x)
#define LoopR(x,l,r) for (ll x = (r)-1; x >= (ll)(l); --x)
typedef long long ll;
typedef std::pair<int, int> pii;
typedef std::pair<ll , ll > pll;
using namespace std;
const int mod = 1e9+7;
ll pw(ll x, ll y)
{
ll ans = 1;
while (y) {
if (y%2)
ans = ans*x % mod;
x = x*x % mod;
y /= 2;
}
return ans;
}
ll inv(ll x) { return pw(x, mod-2); }
const int N = 100'010;
ll fct[N], fcti[N];
void init()
{
fct[0] = 1;
Loop (i,1,N)
fct[i] = fct[i-1] * i % mod;
fcti[N-1] = inv(fct[N-1]);
LoopR (i,1,N)
fcti[i-1] = fcti[i] * i % mod;
}
ll C(int n, int r)
{
if (r < 0 || n < r)
return 0;
return fct[n] * fcti[r] % mod * fcti[n-r] % mod;
}
typedef vector<int> poly;
typedef unsigned long long ull;
#define MOD(x) ((x) = ((x) >= mod? (x) - mod: x))
poly karatsuba(poly a, poly b)
{
int n = a.size();
if (n <= 30) {
poly ans(2*n-1);
vector<ull> ansl(2*n-1);
Loop (i,0,n) Loop (j,0,n/2)
ansl[i+j] += (ull)a[i] * b[j];
Loop (i,0,2*n-1)
ansl[i] %= mod;
Loop (i,0,n) Loop (j,n/2,n)
ansl[i+j] += (ull)a[i] * b[j];
Loop (i,0,2*n-1)
ans[i] = ansl[i] % mod;
return ans;
}
poly a12((n+1)/2), a2((n+1)/2);
poly b12((n+1)/2), b2((n+1)/2);
Loop (i,0,n/2) {
a12[i] += a[i];
b12[i] += b[i];
}
Loop (i,n/2,n) {
a12[i-n/2] += a[i];
a2[i-n/2] += a[i];
b12[i-n/2] += b[i];
b2[i-n/2] += b[i];
MOD(a12[i-n/2]);
MOD(b12[i-n/2]);
}
a.resize(n/2);
b.resize(n/2);
poly ans, ans12, ans2;
ans = karatsuba(a, b);
ans12 = karatsuba(a12, b12);
ans2 = karatsuba(a2, b2);
Loop (i,0,ans.size()) {
ans12[i] += mod - ans[i];
MOD(ans12[i]);
}
ans.resize(2*n-1);
Loop (i,0,ans2.size()) {
ans[i+2*(n/2)] += ans2[i];
ans12[i] += mod - ans2[i];
MOD(ans[i+2*(n/2)]);
MOD(ans12[i]);
}
Loop (i,0,ans12.size()) {
ans[i+n/2] += ans12[i];
MOD(ans[i+n/2]);
}
return ans;
}
vector<int> stir;
void init_stir(int m)
{
poly A(N), B(N);
Loop (i,0,N) {
A[i] = pw(i, m) * fcti[i] % mod;
B[i] = pw(mod-1, i) * fcti[i] % mod;
}
stir = karatsuba(A, B);
stir.resize(N);
Loop (i,0,N)
stir[i] = fct[i] * stir[i] % mod;
}
int main()
{
cin.tie(0) -> sync_with_stdio(false);
ll a, b;
cin >> b >> a;
init();
init_stir(b);
ll ans = 0;
Loop (x,0,a) {
ll dard = stir[a-x] * C(b-a+x, x) % mod;
ans += x%2? -dard: dard;
}
ans = (ans%mod+mod) % mod;
cout << ans << '\n';
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |