Submission #712809

# Submission time Handle Problem Language Result Execution time Memory
712809 2023-03-20T06:54:16 Z ymm Asceticism (JOI18_asceticism) C++17
4 / 100
600 ms 7776 KB
#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
1 Correct 596 ms 7596 KB Output is correct
2 Correct 596 ms 7612 KB Output is correct
3 Correct 589 ms 7532 KB Output is correct
4 Correct 590 ms 7776 KB Output is correct
5 Correct 587 ms 7556 KB Output is correct
6 Correct 582 ms 7720 KB Output is correct
7 Correct 587 ms 7528 KB Output is correct
8 Correct 577 ms 7712 KB Output is correct
9 Correct 579 ms 7716 KB Output is correct
10 Correct 583 ms 7620 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 596 ms 7596 KB Output is correct
2 Correct 596 ms 7612 KB Output is correct
3 Correct 589 ms 7532 KB Output is correct
4 Correct 590 ms 7776 KB Output is correct
5 Correct 587 ms 7556 KB Output is correct
6 Correct 582 ms 7720 KB Output is correct
7 Correct 587 ms 7528 KB Output is correct
8 Correct 577 ms 7712 KB Output is correct
9 Correct 579 ms 7716 KB Output is correct
10 Correct 583 ms 7620 KB Output is correct
11 Execution timed out 608 ms 7556 KB Time limit exceeded
12 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 596 ms 7596 KB Output is correct
2 Correct 596 ms 7612 KB Output is correct
3 Correct 589 ms 7532 KB Output is correct
4 Correct 590 ms 7776 KB Output is correct
5 Correct 587 ms 7556 KB Output is correct
6 Correct 582 ms 7720 KB Output is correct
7 Correct 587 ms 7528 KB Output is correct
8 Correct 577 ms 7712 KB Output is correct
9 Correct 579 ms 7716 KB Output is correct
10 Correct 583 ms 7620 KB Output is correct
11 Execution timed out 608 ms 7556 KB Time limit exceeded
12 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 596 ms 7596 KB Output is correct
2 Correct 596 ms 7612 KB Output is correct
3 Correct 589 ms 7532 KB Output is correct
4 Correct 590 ms 7776 KB Output is correct
5 Correct 587 ms 7556 KB Output is correct
6 Correct 582 ms 7720 KB Output is correct
7 Correct 587 ms 7528 KB Output is correct
8 Correct 577 ms 7712 KB Output is correct
9 Correct 579 ms 7716 KB Output is correct
10 Correct 583 ms 7620 KB Output is correct
11 Execution timed out 608 ms 7556 KB Time limit exceeded
12 Halted 0 ms 0 KB -