- 8月19号
T6
- @ 2025-8-19 17:05:06
#include<bits/stdc++.h>
using namespace std;
const int mod = 998244353;
long long f[110][110][110];
int main()
{
int n;
cin >>n;
vector<int> a(n + 1);
for(int i = 0; i < n; i++)
cin >>a[i];
long long ans = 0;
for(int k = 1; k <= n; k ++) {
memset(f, 0, sizeof f);
f[0][0][0] = 1;
for(int i = 0; i < n; i++)
{
for(int j = 0; j <= k; j++)
{
for(int l = 0; l < k; l ++)
{
if(f[i][j][l] == 0) continue;
//不选
f[i + 1][j][l] = (f[i +1][j][l] + f[i][j][l]) % mod;
if(j < k)
{
int new_l = (l + a[i]) % k;
f[i+1][j+1][new_l] = (f[i+1][j+1][new_l] + f[i][j][l]) % mod;
}
}
}
}
ans = (ans + f[n][k][0]) % mod;
}
cout << ans;
return 0;
}
/*
f[i][j][k]:表示从前i个数字中选择j个,且对j取余是k的方案数
最终答案:f[n][i][0] 求和
状态计算:
第一层循环: 本次一共选择多少个数 k
第二层循环:从前i个数中选 i
第三层循环:枚举 取 0~k个数 j
第四层循环:枚举余数l: 0~k-1 l
不选:f[i+1][j][l] += f[i][j][l];
选: j < k
new_l = (l + a[i]) % k
f[i+1][j+1][new_l] += f[i][j][l]
*/
0 条评论
目前还没有评论...