题意:置换群,问环的长度有多少种
分析:
环的长度就是每次你选择的区间长度的最小公倍数。总区间长度是n,那么这道题就是求和等于n的各个数的最小公倍数有多少种。
状态:dp[i][j]前i个质数,区间长度不超过j的最优解
转移:dp[i][j]=dp[i-1][j]+dp[i-1][j-k],k=prim[i]^1,2...
这题和上一题的dp难哭我了。
代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<string> using namespace std; int n; long long dp[300][2000]; int prim[300],vis[2000],cnt; void is_prim() { cnt=1; memset(vis,0,sizeof(vis)); for(int i=2;i<=1000;i++){ if(!vis[i]){ prim[cnt++]=i; for(int j=i;j<=1000;j+=i){ vis[j]=1; } } } } void DP() { memset(dp,0,sizeof(dp)); for(int i=0;i<=1000;i++) dp[0][i]=1; for(int i=1;i<cnt;i++){ for(int j=0;j<=1000;j++){ dp[i][j]=dp[i-1][j]; for(int k=prim[i];k<=j;k*=prim[i]) dp[i][j]+=dp[i-1][j-k]; } } } int main() { is_prim(); DP(); while(scanf("%d",&n)!=EOF){ printf("%I64d\n",dp[cnt-1][n]); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/ac_0_summer/article/details/47283515