Pagini recente » Cod sursa (job #552598) | Cod sursa (job #2471867) | Cod sursa (job #2317581) | Cod sursa (job #1744931) | Cod sursa (job #2563909)
#pragma GCC optimize("O2")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("avx,avx2,sse,sse2,ssse3,fma,tune=native")
#include<bits/stdc++.h>
#define next kjdsafasjljfdslakjfs
using namespace std;
const int maxn = 330, mod = 10007;
int n, k, fact[maxn], part[maxn], dp[9][maxn];
void setup() {
fact[0] = 1;
for(int i = 1; i < maxn; i++) fact[i] = (fact[i-1]*i)%mod;
part[1] = part[2] = 1;
for(int i = 3; i < maxn; i++) {
part[i] = fact[i];
for(int j = 1; j < i; j++)
part[i] = (mod + part[i] - (fact[i-j]*part[j]%mod))%mod;
}
}
int cur[maxn], next[maxn];
int main() {
freopen("permutari2.in", "r", stdin);
freopen("permutari2.out", "w", stdout);
setup();
cin >> n >> k;
dp[0][0] = 1;
for(int len = 1; len <= n; len++)
dp[0][len] = part[len];
for(int k = 1; k < 9; k++)
for(int len = 0; len <= n; len++) {
for(int i = 1; i < len; i++) {
dp[k][len] += dp[k-1][i]*dp[k-1][len-i]%mod;
if(dp[k][len]>=mod) dp[k][len]-=mod;
}
}
cur[0] = 1;
for(int a = 0; a < 9; a++) {
if(!((k>>a)&1)) continue;
for(int len = 0; len <= n; len++)
for(int i = 0; i <= len; i++) {
next[len] += cur[i]*dp[a][len-i]%mod;
if(next[len]>=mod) next[len]-=mod;
}
for(int i = 0; i <= n; i++) cur[i] = next[i], next[i] = 0;
}
cout << cur[n] << '\n';
}