这个题可以应用dp
#include<bits/stdc++.h> using namespace std; const int mod=1e9+7; inline int read() { int a=0,b=1; char c=getchar(); while(c<'0'||c>'9') { if(c=='-') b=-1; c=getchar(); } while(c>='0'&&c<='9') { a=(a<<3)+(a<<1)+c-'0'; c=getchar(); } return a*b; } inline void out(int n) { if(n<0) { putchar('-'); n=-n; } if(n>=10) out(n/10); putchar(n%10+'0'); } int s[1001]; int dp[1001][1001]; int main() { int n=read(),k=read(); for(int i=1;i<=n;i++) s[i]=read(); dp[0][0]=1; for(int i=1;i<=n;i++) { for(int j=0;j<k;j++) { int t=j-s[i]%k; if(t<0) t+=k; dp[i][j]=(dp[i-1][j]+dp[i-1][t])%mod; } } out(dp[n][0]); return 0; }
我们用dp[i][j]表示dp到i,%key为j的方案数
根据推导,我们发现
可以得到这样一个dp转移方程
dp[i][j]=(dp[i-1][j]+dp[i-1][j-s[i]%k])%mod;
保证j-s[i]%k>0
那么可以得到代码