记录编号 532930 评测结果 AAAAAAAAAA
题目名称 2340.[HZOI 2015]疯狂的求和问题 最终得分 100
用户昵称 神利·代目 是否通过 通过
代码语言 C++ 运行时间 0.499 s
提交时间 2019-06-08 18:42:00 内存使用 12.03 MiB
显示代码纯文本
#define _CRT_SECURE_NO_WARNINGS
#define maxn 500010ul

#include <stdio.h>

int n, k, s1, P[maxn], invf[maxn], fac[maxn], inv[maxn]; const int mod = 998244353;

void read(register int& x) {
	x = 0; register int c = getchar(); for (; c<'0' || c>'9'; c = getchar());
	for (; c >= '0' && c <= '9'; c = getchar()) x = ((x * 10ll) + (c ^ 48ll)) % mod; return;
}

int power(int p, int k) {
	if (p == -1) { if (k & 1) return -1; else return 1; }
	int ret = 1;
	while (k) {
		if (k & 1) ret = 1ll * ret * p % mod;
		k >>= 1, p = 1ll * p * p % mod;
	} return ret;
}

int main() {
	freopen("Crazy_Sum.in", "r", stdin);
	freopen("Crazy_Sum.out", "w", stdout);
	read(n), read(k), n++, k++; fac[0] = inv[0] = inv[1] = invf[0] = 1;
	for (int i = 1; i <= k; i++) fac[i] = 1ll * fac[i - 1] * i % mod;
	for (int i = 2; i <= k; i++) inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod;
	for (int i = 1; i <= k; i++) invf[i] = 1ll * invf[i - 1] * inv[i] % mod;
	for (int i = 2; i <= k; i++) P[i] = (power(i - 1, k - 1) + P[i - 1]) % mod;
	if (n <= k) return printf("%d\n", P[n]), 0;
	s1 = n; for (int i = 1; i <= k; i++) s1 = 1ll * s1 * (n - i) % mod;
	int ans = 0;
	for (int j = 0; j <= k; j++) (ans += 1ll * power(-1, k - j) * P[j] % mod * s1 % mod * invf[k - j] % mod * invf[j] % mod * power(n - j, mod - 2) % mod) %= mod;
	printf("%d\n", (ans % mod + mod) % mod); return 0;
}
/*
#include<stdio.h>
#define maxn 500010
#define mod 998244353
int n, k, s1, P[maxn], invfac[maxn], fac[maxn], inv[maxn];

int mypow(int x, int y) {
	if (x == -1)return y & 1 ? -1 : 1;
	int res = 1;
	while (y) {
		if (y & 1)res = 1ll*res * x % mod;
		y >>= 1;
		x = 1ll * x * x % mod;
	}
	return res;
}

int main() {
	freopen("Crazy_Sum.in", "r", stdin);
	freopen("Crazy_Sum.out", "w", stdout);
	scanf("%d%d", &n, &k);
	
	fac[0] = 1;
	for (int i = 1; i <= k + 1; ++i)
		fac[i] = 1ll * fac[i - 1] * i % mod;

	inv[1] = 1;
	for (int i = 2; i <= k + 1; ++i)
		inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod;

	invfac[0] = 1;
	for (int i = 1; i <= k + 1; ++i)
		invfac[i] = 1ll * invfac[i - 1] * inv[i] % mod;

	P[0] = 0;
	for (int i = 1; i <= k + 1; ++i)
		P[i] = (P[i - 1] + mypow(i, k)) % mod;

	if (n <= k + 1) {
		printf("%d\n", P[n]);
		return 0;
	}

	int s1 = 1;
	for (int i = n; i >= n - k - 1; --i)
		s1 = 1ll * s1 * i % mod;
	int ans = 0;
	for (int i = 0; i <= k + 1; ++i) {
		int temp = 1ll * s1 * invfac[i] % mod * invfac[k + 1 - i] % mod * mypow(n - i, mod - 2) % mod * mypow(-1, k + 1 - i);
		ans = (ans + 1ll * P[i] * temp) % mod;
	}
	printf("%d\n", (ans % mod + mod) % mod);
}
*/