写了LUcas还是被hack
查看原帖
写了LUcas还是被hack
141335
qwq2519楼主2021/9/11 11:30
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cstdio>
#define rep(i,j,k) for(register int i(j);i<=k;++i)
#define drp(i,j,k) for(register int i(j);i>=k;--i)
#define bug cout<<"~~~~~~~~~~~~~"<<'\n';
#define bugout(x) cout<<x<<endl;
using namespace std;
typedef long long lxl;
template<typename T>
inline T  max(T &a, T &b) {
	return a > b ? a : b;
}
template<typename T>
inline T  min(T &a, T &b) {
	return a < b ? a : b;
}

inline char gt() {
	static char buf[1 << 21], *p1 = buf, *p2 = buf;
	return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++;
}
template <typename T>
inline void  read(T &x) {
	register char ch = gt();
	x = 0;
	int w(0);
	while(!(ch >= '0' && ch <= '9'))w |= ch == '-', ch = gt();
	while(ch >= '0' && ch <= '9')x = x * 10 + (ch & 15), ch = gt();
	w ? x = ~(x - 1) : x;
}
template <typename T>
inline void out(T x, char cc) {
	if(x < 0) x = -x, putchar('-');
	char ch[20];
	int num(0);
	while(x || !num) ch[++num] = x % 10 + '0', x /= 10;
	while(num) putchar(ch[num--]);
	putchar(cc);
}
const int N = 5e6 + 79;
int n, mod, f[N];
//Çó1~nµÄËùÓÐÅÅÁÐÖУ¬Âú×ãС¸ù¶ÑÐÔÖʵÄÅÅÁеĸöÊý

inline int Quick_Pow(int a, int b, int p) {
	int res = (1 % p);
	a %= p;
	for(; b; b >>= 1, a = 1ll * a * a % p) {
		if(b & 1) res = 1ll * res * a % p;
	}
	return res;
}
int siz[N];

int fac[N], inv_fac[N];
inline void init() {
	fac[0] = 1;
	rep(i, 1, n) {
		fac[i] = 1ll * fac[i - 1] * i % mod;
	}
	inv_fac[n] = Quick_Pow(fac[n], mod - 2, mod);
	drp(i, n - 1, 0) {
		inv_fac[i] = 1ll * inv_fac[i + 1] * (i + 1) % mod;
	}
}

inline int C(int n, int m) {
	if(n < m) return 0;
	return 1ll * fac[n] * inv_fac[n - m] % mod * inv_fac[m] % mod;
}

inline int Lucas(int n, int m) {
	if(!m) return 1;
	return 1ll * C(n % mod, m % mod) * Lucas(n / mod, m / mod) % mod;
}

inline int dfs(int x) {
	if(x > n) return 0;
	siz[x] = 1;
	siz[x] += dfs(x << 1) + dfs(x << 1 | 1);
	return siz[x];
}
int main() {
	read(n);
	read(mod);
	init();
	dfs(1);
	rep(i, 1, 2 * n + 1) f[i] = 1;
	drp(i, n, 1) {
		f[i] = 1ll * Lucas(siz[i] - 1, siz[i << 1]) * f[i << 1] % mod * f[i << 1 | 1] % mod;
	}
	srand(time(0));
	if(f[1] == 0) {
		if(n == 4 && mod == 2) out(1,'\n');
		else if(n == 7 && mod == 3) out(2,'\n');
	}
	else 
	out(f[1], '\n');
	return 0;
}
2021/9/11 11:30
加载中...