ZOJ 4011——Happy Sequence(dp)
阿新 • • 發佈:2018-12-15
題意:給一個n和m,求所有組成m長且值在1-n內且滿足 a[i]%a[i-1]==0 的序列方案數。
思路:dp[i][j] 表示長度為 i 的序列的最後一位為 j ,轉移方程:dp[i][j]=0 , dp[i][j]+=dp[i-1][ j的因子 ] 。因子可以通過埃氏篩打表得到,dp[m][i]累加和即為答案,預處理2000*2000以內所有答案即可。
程式碼:
#include<bits/stdc++.h> using namespace std; #define N 2005 #define mod 1000000007 int dp[N][N]; vector<int>y[N]; //儲存因子 int main() { for(int i=1; i<=N; i++) { for(int j=i; j<=N; j+=i) { y[j].push_back(i); } } for(int i=1; i<=N; i++) dp[1][i]=1; for(int i=2; i<=N; i++) { for(int j=1; j<=N; j++) { for(int k=0; k<y[j].size(); k++) { dp[i][j]=(dp[i][j]+dp[i-1][y[j][k]])%mod; } } } int t; scanf("%d",&t); while(t--) { int n,m; scanf("%d%d",&n,&m); int ans=0; for(int i=1; i<=n; i++) ans=(ans+dp[m][i])%mod; printf("%d\n",ans); } }