过了样例但是0分求调
查看原帖
过了样例但是0分求调
374330
yimuhua楼主2023/12/23 11:43
#include <bits/stdc++.h>
#define int __int128
using namespace std;
namespace IO {
	inline char gc() {
		static const int IN_LEN = 1 << 18 | 1;
		static char buf[IN_LEN], *s, *t;
		return (s == t) && (t = (s = buf) + fread(buf, 1, IN_LEN, stdin)), s == t ? -1 : *s++;
	}
	template <typename T>
	inline void read(T &x) {
		static char ch, ff;
		ch = gc(), ff = 0;
		for(; !isdigit(ch); ch = gc())
			ff |= ch == '-';
		for(x = 0; isdigit(ch); ch = gc())
			x = (x << 3) + (x << 1) + (ch ^ 48);
		ff && (x = -x);
		return;
	}
	template <typename T, typename ...t>
	void read(T&x, t& ...y) {
		read(x), read(y...);
		return;
	}
	template <typename T>
	inline void print(T x) {
		static int pr, pri[105], temp;
		pr = 0, temp = x;
		if(x < 0)
			fputc('-', stdout), x = -x;
		if(!x) {
			fputc(48, stdout);
			return;
		}
		while(x)
			pri[++pr] = x % 10, x /= 10;
		for(; pr; pr--)
			fputc(pri[pr] + 48, stdout);
		x = temp;
		return;
	}
	template <typename T, typename ...t>
	void print(T&x, t& ...y) {
		print(x), fputc(' ', stdout), print(y...);
		return;
	}
}
using namespace IO;
struct node {
	int x, m;
}a[1000005];
int n, m, mod;
vector<node> p;
int fpow(int x, int y, int mod) {
	int s = 1;
	while(y) {
		if(y & 1)
			s = s * x % mod;
		x = x * x % mod, y >>= 1;
	}
	return s;
}
int exgcd(int a, int b, int &x, int &y) {
	if(!b) {
		x = 1, y = 0;
		return a;
	}
	int tmp = exgcd(b, a % b, x, y), p = x;
	x = y, y = p - a / b * y;
	return tmp;
}
int Inv(int a, int mod) {
	int x, y;
	exgcd(a, mod, x, y);
	return (x + mod) % mod;
}
int f(int x, int p, int mod) {
	if(!x)
		return 1;
	int s1 = 1, s2 = 1;
	for(int i = 1; i < mod; i++)
		if(i % p)
			s1 = s1 * i % mod;
	for(int i = n / mod * mod; i <= n; i++)
		if(i % p)
			s2 = s2 * i % mod;
	return f(x / p, p, mod) * fpow(s1, n / mod, mod) % mod * s2 % mod;
}
int g(int x, int p) {
	if(x < p)
		return 0;
	return x / p + g(x / p, p);
}
node calc(int p, int mod) {
	return {(f(n, p, mod) * Inv(f(m, p, mod), mod) % mod * Inv(f(n - m, p, mod), mod) % mod * fpow(p, g(n, p) - g(m, p) - g(n - m, p), mod) % mod + mod) % mod, mod};
}
node merge(int a, int m, int a2, int m2) {
	int x, y, g = exgcd(m, m2, x, y), mod = m / g * m2;
	return {(a + (a2 - a) / g * x % mod * m % mod + mod) % mod, mod};
}
signed main() {
	read(n, m, mod);
	for(int i = 2; i * i <= mod; i++)
		if(!(mod % i)) {
			int s = 1;
			while(!(mod % i))
				s *= i, mod /= i;
			p.push_back({i, s});
		}
	if(mod ^ 1)
		p.push_back({mod, mod});
	for(int i = 0; i < p.size(); i++)
		a[i] = calc(p[i].x, p[i].m);
	for(int i = 1; i < p.size(); i++)
		a[0] = merge(a[0].x, a[0].m, a[i].x, a[i].m);
	print(a[0].x);
	return 0;
}
2023/12/23 11:43
加载中...