[BZOJ]1025
题意:
给出
n
的最大值,求在
题解:
首先要知道一个知识:任何一个置换都可以由一些循环的乘积得来。这样的话不同的循环有各自的循环节,长度为
n
的循环其循环节是
1是不影响
lcm
的,所以合数的情况都可以用质数来表示,而不同的质数之间的
lcm
肯定不一样(因子完全不一样),那么就可以用
dp
来做了。
dp[i][j]
表示用了前
i
个质数,凑出了
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
const int Maxn = 1010;
ll dp[Maxn][Maxn];
int Judge[Maxn],prime[Maxn],n,tot;
ll Dfs(int x,int w){
if(dp[x][w] > 0)return dp[x][w];
if(w <= 0)return 1ll;
dp[x][w] = Dfs(x,w - 1);
for(int i = prime[w];i <= x;i *= prime[w]){
dp[x][w] += Dfs(x - i,w - 1);
}return dp[x][w];
}
int main(){
scanf("%d",&n);Judge[1] = 1;
for(int i = 2;i <= n;i++){
if(!Judge[i])for(int j = 2;i * j <= n;j++)Judge[i * j] = 1;
}for(int i = 1;i <= n;i++)if(!Judge[i])prime[++tot] = i;
printf("%lld\n",Dfs(n,tot));
return 0;
}