ABC256G

首先可以想到枚举每条边上的白色石子个数,记为 k

则最终答案为 d+1k=0f(k)f(x) 表示每条边的石子个数为 x 时的答案。

那么可以想到一个暴力的 dp 状态,设 fi,j,k 表示考虑了前 i 条边,最开始的点的颜色是 j,这条边的终点的颜色是 k 时的方案数,其中 1 为白色,0 为黑色。
则有如下转移:

fi+1,0,0=fi,0,0×(D1K)+fi,0,1×(D1K1)

fi+1,0,1=fi,0,0×(D1K1)+fi,0,1×(D1K2)

fi+1,1,0=fi,1,0×(D1K)+fi,1,1×(D1K1)

fi+1,1,1=fi,1,0×(D1K1)+fi,1,1×(D1K2)

由于原图是个环,所以最后只有 fn,0,0fn,1,1 有贡献。

那么发现转移和 i 无关,于是写成矩阵形式,不难发现其实就是 [A0,0A0,1A1,0A1,1]n,其中 Ai,j=(D1Kij)

直接矩阵快速幂优化即可。

Code:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 10005, mod = 998244353;
ll n; int D;
int fac[N], inv[N];
struct mat {
	int a[2][2];
	
	mat operator * (const mat &x) const {
		mat res; memset(res.a, 0, sizeof res.a);
		for (int i = 0; i < 2; ++i)
			for (int j = 0; j < 2; ++j)	
				for (int k = 0; k < 2; ++k)
					res.a[i][j] = (res.a[i][j] + 1ll * a[i][k] * x.a[k][j] % mod) % mod;
		return res;
	}
} f;

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

void init(int maxn) {
	fac[0] = 1;
	for (int i = 1; i <= maxn; ++i) fac[i] = 1ll * fac[i - 1] * i % mod;
	inv[maxn] = qpow(fac[maxn], mod - 2);
	for (int i = maxn - 1; ~i; --i) inv[i] = 1ll * inv[i + 1] * (i + 1) % mod;
}

int C(int n, int m) {
	if (n < 0 || m < 0 || n < m) return 0;
	return 1ll * fac[n] * inv[m] % mod * inv[n - m] % mod;
}

mat qpow(mat x, ll y) {
	mat res; res = f;
	while (y) {
		if (y & 1) res = res * x;
		x = x * x;
		y >>= 1;
	}
	return res;
}

int main() {
	init(10000);
	scanf("%lld%d", &n, &D);
	memset(f.a, 0, sizeof f.a);
	f.a[0][0] = f.a[1][1] = 1;
	int ans = 0;
	for (int k = 0; k <= D + 1; ++k) {
		mat tmp;
		for (int i = 0; i < 2; ++i)
			for (int j = 0; j < 2; ++j)
				tmp.a[i][j] = C(D - 1, k - i - j);
		tmp = qpow(tmp, n);
		ans = (ans + tmp.a[0][0]) % mod;
		ans = (ans + tmp.a[1][1]) % mod;
	}
	printf("%d", ans);
	return 0;
}
posted @   Kobe303  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示