【洛谷T89379 【qbxt】复读警告】

题目链接

这个题可以应用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

那么可以得到代码

原文地址:https://www.cnblogs.com/gongcheng456/p/11238361.html