Codeforces Round #240 (Div. 1) B. Mashmokh and ACM(DP)

https://codeforces.com/contest/414/problem/B

题目大意:

给定一个范围【1,k】,要求我们从这里面选出n个数字,并且满足任意两个相邻数字中后一个数字 % 前一个数字==0

问我们这样的数据有多少?对1e9+7取模。
inputCopy
3 2
outputCopy
5

inputCopy
6 4
outputCopy
39

inputCopy
2 1
outputCopy
2

f[i][j]表示长度为i的序列最后一位是j

需要注意

f[i][x]=(f[i][x]+f[i-1][j])%mod; ans=(ans+f[n][j])%mod;

这两条语句分开来写的话,可能会在取模后出现差错
还是合在一起取模比较安全

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL N=200200,M=2500;
const LL mod=1e9+7;
LL f[M][M];
//f[i][j]表示长度为i的序列最后一位是j
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    LL T=1;
    //cin>>T;
    while(T--)
    {
        LL k,n;
        cin>>k>>n;
        f[0][1]=1;
        for(LL i=1;i<=n;i++)//n个位置
        {
            for(LL j=1;j<=k;j++)//从【1,k】之间选择数字
            {
                for(LL x=j;x<=k;x+=j)//每次选择了一个之后,对前一位以j为末尾数字的数量进行
                {
                    f[i][x]=(f[i][x]+f[i-1][j])%mod;
                }
            }
        }
        LL ans=0;
        for(LL j=1;j<=k;j++)//每次都加上以j为底数的就是最终的答案
        {
            ans=(ans+f[n][j])%mod;
        }
        cout<<ans<<endl;
    }
    return 0;
}
posted @ 2022-09-27 18:21  Vijurria  阅读(17)  评论(0编辑  收藏  举报