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";

浙公网安备 33010602011771号