递归暴搜,注意的是乘积用int要爆
#include<iostream>
#include<map>
#include <string>
#include<algorithm>
#include<fstream>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
#define lch(i) ((i)<<1)
#define rch(i) ((i)<<1|1)
#define sqr(i) ((i)*(i))
#define pii pair<int,int>
#define mp make_pair
#define FOR(i,b,e) for(int i=b;i<=e;i++)
#define FORE(i,b,e) for(int i=b;i>=e;i--)
#define ms(a) memset(a,0,sizeof(a))
const int maxnum =1000000001;
const int mod = 1000000007;
int n,m,len,deepest;
unsigned long long num;
void dfs(int sum,int last,unsigned long long mul){
if(sum==n){
if(mul%m==0) num++;
return;
}
FOR(i,last+1,n-sum){
dfs(sum+i,i,mul*i);
}
}
int main()
{
/*fstream fin("G:/1.txt");
while(fin>>n>>m){*/
while(cin>>n>>m){
num=0;
dfs(0,0,1);
num%=mod;
cout<<num<<endl;
}
return 0;
}