自己dp 太菜 基本没写过题所以就 从新来过从最简单的开始写吧 记录一下自己的历程
题目链接:牛牛与数组
dp[j,i] 表示 第j 位数 以i 结尾的 有多少个
先记录 以i结尾的 一共多少 然后把i 的 因子找出来 去掉就好了
#include<bits/stdc++.h> using namespace std; #define maxn 100005 const int mod = (int)1e9+7; int dp[11][maxn]; int main(){ int n,k; scanf("%d%d",&n,&k); for( int j=1;j<=k;j++){ dp[1][j] = 1; } for(int j=2;j<=n;j++){ int x = 0, y = 0; for(int i=1;i<=k;i++){ x += dp[j-1][i]; // 记录总和 x = x%mod; } for(int i=1;i<=k;i++){ y = 0; for(int z = i*2;z<=k;z+=i){ y += dp[j-1][z]; // 把i 的因子全部去掉 y %= mod; } dp[j][i] = (x-y+mod)%mod; } } int ans = 0; for(int j=1;j<=k;j++){ ans += dp[n][j]; ans %= mod; } printf("%d\n",ans); return 0; }