莫反神题求调
查看原帖
莫反神题求调
999274
5t0_0r2楼主2024/9/17 16:24

我是看了这个视频才入坑的QAQ

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 9,MOD = 32465177;
int quick_pow(int x,int y){
	int ret = 1;
	while(y){
		if(y & 1)
			ret = ret * x % MOD;
		x = x * x % MOD;
		y >>= 1;
	}
	return ret;
}
int qpow(int x,int y){
	if(y >= 0)
		return quick_pow(x,y);
	return quick_pow(quick_pow(x,-y),MOD - 2);
}
int n;
bool is_not_prime[N] = {1,1};
int prime[N],top;
int mu[N]; 
void sieve(){
	mu[1] = 1;
	for(int i = 2;i <= n;i++){
		if(!is_not_prime[i]){
			prime[++top] = i;
			mu[i] = -1;
		}
		for(int j = 1;j <= top && i * prime[j] <= n;j++){
			is_not_prime[i * prime[j]] = 1;
			if(i % prime[j] == 0)
				break;
			mu[i * prime[j]] = -mu[i];
		}
	}
}
int f[N],g[N];
int x[N],y[N];
int p[N],q[N];
void init(){
	f[0] = 1;g[0] = 0;
	for(int i = 1;i <= n;i++){
		f[i] = f[i - 1] * qpow(i,i) % MOD;
		g[i] = (g[i - 1] + i) % MOD;
	}
	for(int i = 1;i <= n;i++)
		y[i] = 1;
	for(int i = 1;i <= n;i++)
		for(int j = i;j <= n;j += i){
			(x[j] += i * mu[i] % MOD) %= MOD;
			(y[j] *= qpow(i,i * mu[i])) %= MOD;
		}
	for(int i = 1;i <= n;i++){
		p[i] = i * x[i] % MOD;
		q[i] = qpow(y[i] * qpow(i,x[i]),i);
	}
}
int h(int n,int m){
	return qpow(f[n],g[m]) * qpow(f[m],g[n]) % MOD;
}
int S(int n,int m){
	if(n == 0 || m == 0)
		return 1;
	if(n > m)
		swap(n,m);
	int ret = 1;
	for(int T = 1;T <= n;T++){
		//cout << p[T] << ' ' << g[n / T] * g[m / T] << '\n';
		//cout << h(n / T,m / T) << ' ' << q[T] << '\n';
		(ret *= qpow(h(n / T,m / T),p[T]) * qpow(q[T],g[n / T] * g[m / T]) % MOD) %= MOD;
	}
	return ret;
}
signed main(){
	int T;
	cin >> T >> n;
	sieve();
	init();
	while(T--){
		int l,r;
		cin >> l >> r;
		int ans = S(r,r) * S(l - 1,l - 1) % MOD * qpow(qpow(S(l - 1,r),2),MOD - 2) % MOD;
		cout << (ans + MOD) % MOD << '\n';
	}
	return 0;
}
2024/9/17 16:24
加载中...