[ABC262D] I Hate Non-integer Number
思路
这道题还是有一点难度的,我们首先可以发现这是一个 Dp,然后我们一眼就能想到一个定义状态的方式为 \(f_{i,j,k,l}\) 为前 \(i\) 个数选 \(j\) 个其总和模 \(k\) 等于 \(l\) 的方案数。我们这样定义的原因是因为既然平均数为整数,所以肯定有 \(sum\bmod l=0\) 这里的 \(sum\) 为总和,\(l\) 为个数。我们转移时可以将第一维压掉,然后枚举一个 \(j,k,l\) 因为 \(k\) 可以固定所以就很好转移了,方程为 \(f_{i,j,k,l}=f_{i,j,k,l}+f_{i-1,j,k,l}+f_{i-1,j-1,k,(l+k\times 10^9-a_i)\bmod k}\) 这里之所以要乘 \(10^9\) 是因为我们在加上以后还要模上 \(k\) 所以为了减之后不为负数先要加过原数,就是能够使 \((l+k\times 10^9-a_i)\equiv (l-a_i)\bmod k\)。
答案就是 \(f_{n,i,i,0}\) 的和。
代码
#include <bits/stdc++.h>
#define IOS std::ios::sync_with_stdio(fasle);cin.tie(NULL);cout.tie(NULL)
#define int long long
#define ri register int
#define rep(i,x,y) for(ri i=x;i<=y;i++)
#define rep1(i,x,y) for(ri i=x;i>=y;i--)
#define il inline
#define fire signed
#define pai(a,x,y) sort(a+x,a+y+1)
using namespace std ;
il int qmi(int a,int b) {
int res=1;
while(b) {
if(b&1) res=(res*a);
a=a*a;
b>>=1;
}
return res;
}
void print(int x) {
if(x>=10) print(x/10);
putchar(x%10+'0');
}
#define gcd(x,y) __gcd(x,y)
#define lcm(x,y) x*y/gcd(x,y)
const int N=101;
int f[2][N][N][N],n,a[N];//从前i个中选了j个总和模k=l
const int mod=998244353;
fire main() {
cin>>n;
rep(i,1,n) cin>>a[i];
rep(i,1,n) {
rep(k,1,n) f[0][0][k][0]=1;
rep(j,1,i) {
rep(k,1,n) {
rep(l,0,k-1) {
f[1][j][k][l]+=(f[0][j][k][l]+f[0][j-1][k][(l+k*1000000000-a[i])%k])%mod;
}
}
}
rep(j,1,i) {
rep(k,1,n) {
rep(l,0,k-1) {
f[0][j][k][l]=f[1][j][k][l];
f[1][j][k][l]=false;
}
}
}
}
int res=0;
rep(j,1,n) (res+=f[0][j][j][0])%=mod;
print(res);
return false;
}

浙公网安备 33010602011771号