本题可直接转化为lcm种类的数量
那么可以把n以内质数找出来 可以发现 x1^a1 + x2^a2 + ... = n
因此可以转化为背包模型
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#define SF scanf
#define PF printf
using namespace std;
typedef long long LL;
const int MAXN = 1000;
int prime[MAXN+10], tot, vis[MAXN+10];
int n;
LL ans, d[MAXN+10][MAXN+10];
void init() {
for(int i = 2; i <= MAXN; i++) {
if(!vis[i])
prime[++tot] = i;
for(int j =1; i * prime[j] <= MAXN; j++) {
vis[prime[j] * i] = 1;
if(i % prime[j] == 0) break;
}
}
}
void dp() {
d[0][0] = 1;
for(int i = 1; i <= tot; i++) {
for(int j = 0; j <= n; j++) d[i][j] = d[i-1][j];
for(int j = prime[i]; j <= n; j *= prime[i])
for(int k = 0; k <= n-j; k++)
d[i][k+j] += d[i-1][k];
}
for(int i = 0; i <= n; i++) ans += d[tot][i];
cout << ans;
}
int main()
{
SF("%d", &n);
init();
dp();
return 0;
}