大致题意:给你一个数字n,问你将其分解为若干不同数字的和,有多少种方案?
思路:一种较优的方案是采用动态规划,使用类似于递归的思想,可以做到O(n^2),而我这里想采用母函数的思想解决该题。
#include<set>
#include<queue>
#include<vector>
#include<string>
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 600005
#define ll long long
int nums[121]={1},cur[121],pol[121][121];
int main(void){
for(int i=1;i<=120;i++)
for(int j=0;j<=120;j+=i)
pol[i][j]=1;
for(int i=1;i<=120;i++){
for(int j=0;j<=120;j++)
for(int k=0;j+k<=120;k++)
cur[j+k]+=nums[j]*pol[i][k];
memcpy(nums,cur,sizeof(cur));
memset(cur,0,sizeof(cur));
}
int q;
while(scanf("%d",&q)!=EOF){
printf("%d\n",nums[q]);
}
return 0;
}