2022牛客寒假训练营1 A题

九小时九个人九扇门

  可以发现数字根其实就是将每个数位都加起来,然后对\(9\)取模,这就是一个数字的数字根。要求的是开启\(9\)扇门有多少种方案,可以考虑从\(x \rightarrow x + a_i\),也就是第\(i\)个人他手表上有的数字\(a_i\)可以让现在能够开启第\(x\)扇门的方案转移到\(x + a_i\)扇门。那么状态转移方程就出来了$$dp_{i+ x} = dp_{i + x} + dp_i$$

int n; std::cin >> n;
std::vector<int> a(n);
for (int i = 0; i < n; i ++ ) std::cin >> a[i];

std::vector<Z> dp(10);
dp[0] = 1;
for(int i = 0; i < n; i ++ ) {
	std::vector<Z> ndp = dp;
	for (int j = 0; j < 9; j ++ ) {
		ndp[(j + a[i]) % 9] += dp[j];
	}
	dp = ndp;
}

for (int i = 1; i < 9; i ++ ) std::cout << dp[i].val() << " ";
std::cout << (dp[0].val() - 1) << "\n";
posted @ 2022-07-06 17:56  浅渊  阅读(22)  评论(0)    收藏  举报