TLE 30分
查看原帖
TLE 30分
80695
Jayun楼主2020/12/19 08:20

rt,可能是是哪里死循环了


ll n, m, p;

ll exgcd (ll a, ll b, ll &x, ll &y) 
{
	if (!b)
	{
		x = 1, y = 0;
		return a;
	}
	ll gcd = exgcd (b, a % b, y, x);
	y -= a / b * x;
	return gcd;
}

ll Inv (ll a, ll p)
{
	ll x, y;
	exgcd (a, p, x, y);
	return (x + p) % p;
}


ll CRT (ll a, ll b, ll p) { return (p / b) * a * Inv(p / b, b) % p;} 

ll F(ll x, ll p) { return x >= p? F(x / p, p) + x / p: 0;}

ll qpow(ll a, ll b, ll p)
{
	ll ans = 1;
	for (; b; b >>= 1, (a *= a) %= p)
		if (b & 1) (ans *= a) %= p;
	return ans;
}

ll G(ll n, ll p, ll pk)
{
	if (!n) return 1;
	ll ans = 1;
	for (int i = 2; i <= pk; i++)
		if (i % p) (ans *= i) %= pk;
	ans = qpow(ans, n / pk, pk);
	
	for (int i = pk * (n / pk); i <= n; i++)
		if (i % p) (ans *= i % pk) %= pk;
	
	return G(n / p, p, pk) * ans % pk;
}

ll C(ll n, ll m, ll p, ll pk) {return G(n, p, pk) * Inv(G(n - m, p, pk), pk) % pk * Inv(G(m, p, pk), pk) % pk * qpow(p, F(n, p) - F(m, p) - F(n - m, p), pk) % pk;}

ll exLucas (ll n, ll m, int p)
{
	ll t = p, ans = 0;
	for (int i = 2; i * i <= p; i++)
	{
		if (t % i) continue;
		ll pk = 1;
		while (!(t % i)) pk *= i, t /= i;
		(ans += CRT(C(n, m, i, pk), pk, p)) %= p;
	}
	if (t > 1) (ans += CRT(C(n, m, t, t), t, p)) %= p;
	return ans % p;
}

int main()
{
	scanf ("%lld%lld%lld", &n, &m, &p);
	printf ("%lld", exLucas(n, m, p));
	return 0;
}
2020/12/19 08:20
加载中...