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;
}