题解
1 #include <iostream>
2
3 using namespace std;
4 // f[0][0][1] = 1;
5 // for (i = 0; i < N; i++)
6 // for (j = 0; j < N; j++)
7 // for (k = 1; k <= M; k++)
8 // if (f[i][j][k] > 0)
9 // for (l = j + 1; l <= N - i; l++)
10 // f[i + l][l][gcd[l * k]] = (f[i + l][l][gcd[l * k]] + f[i][j][k]) % 1000000007;
11 // k = 0;
12 // for (i = 1; i <= N; i++)
13 // k = (k + f[N][i] [M]) % 1000000007;
14 int N, M;
15 int cnt;
16 int gcd(int a,int b)
17 {
18 return b==0?a:gcd(b,a%b);
19 }
20 int main()
21 {
22 cin >> N >> M;
23 cnt = 0;
24 int f[N+1][N+1][M+1];
25 for (int i =0;i<=N;++i)
26 for (int j =0;j<=N;++j)
27 for(int k =0;k<=M;++k)
28 f[i][j][k] = 0;
29 f[0][0][1] = 1;
30 for(int i =0;i<=N;++i)
31 for(int j=0;j<=N;++j)
32 for(int k =0;k<=M;++k)
33 if(f[i][j][k]>0)
34 for(int l=j+1;l<=N-i;++l)
35 f[i+l][l][gcd(l*k,M)] = (f[i][j][k] + f[i+l][l][gcd(l*k,M)]) % 1000000007;
36
37 int k = 0;
38 for(int i=0;i<=N;++i){
39 k = (k + f[N][i][M]) % 1000000007;
40 // cout << f[N][i][M] <<endl;
41 }
42 cout << k << endl;
43 return 0;
44 }