제출 #1329285

#제출 시각아이디문제언어결과실행 시간메모리
1329285mat_jurAsceticism (JOI18_asceticism)C++20
100 / 100
21 ms1092 KiB
#include "bits/stdc++.h"
using namespace std;
#ifdef DEBUG
auto&operator<<(auto &o, pair<auto, auto> p) {o << "(" << p.first << ", " << p.second << ")"; return o;}
auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{"; for(auto e : x) o<<e<<", "; return o<<"}";}
#define debug(X) cerr << "["#X"]: " << X << '\n';
#else 
#define cerr if(0)cout
#define debug(X) ;
#endif
using ll = long long;
#define all(v) (v).begin(), (v).end()
#define ssize(x) int(x.size())
#define fi first
#define se second
#define mp make_pair
#define eb emplace_back

const int mod = 1'000'000'007;

int add(int a, int b) {
	a += b;
	return a >= mod ? a-mod : a;
}

int sub(int a, int b) {
	return add(a, mod-b);
}

int mul(int a, int b) {
	return int(((ll)a*b)%mod);
}

int fpow(int a, int b) {
	int res = 1;
	while (b) {
		if (b&1) {
			res = mul(a, res);
			b--;
		}
		a = mul(a, a);
		b /= 2;
	}
	return res;
}

int inv(int x) {
	return fpow(x, mod-2);
}

struct BinomCoeff {
	vector<int> sil, inv_sil;
	BinomCoeff(int n) {
		sil.resize(n+1);
		inv_sil.resize(n+1);
		inv_sil[0] = sil[0] = 1;
		for (int i = 1; i <= n; ++i) {
			sil[i] = mul(sil[i-1], i);
			inv_sil[i] = inv(sil[i]);
		}
	}

	int operator()(int n, int k) {
		return mul(sil[n], mul(inv_sil[k], inv_sil[n-k]));
	}
};

int main() {
	ios_base::sync_with_stdio(false); cin.tie(nullptr);

	int n, k;
	cin >> n >> k;

	BinomCoeff C(n+1);

	k = n - k;
	int res = 0;
	for (int i = 0; i <= k; ++i) {
		if (i%2)
			res = sub(res, mul(C(n+1, i), fpow(k+1-i, n)));
		else 
			res = add(res, mul(C(n+1, i), fpow(k+1-i, n)));
	}

	cout << res << '\n';
	
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...