Cod sursa(job #2563907)

Utilizator kostia244Savchuck Konstantin kostia244 Data 1 martie 2020 16:01:09
Problema Permutari2 Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.25 kb
#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 < 3; 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';
	
}