P5221 Product(欧拉函数)

P5221 Product(欧拉函数)

题目描述

\({\rm CYJian}\)最近闲的玩起了\(gcd\)。。他想到了一个非常简单而有意思的式子:

\[\large\prod_{i=1}^N\prod_{j=1}^N\frac{lcm(i,j)}{gcd(i,j)}\ (\bmod\ 104857601) \]

\({\rm CYJian}\)已经算出来这个式子的值了。现在请你帮他验算一下吧。\({\rm CYJian}\)只给你\(0.2s\)的时间哦。

数据范围

\(1 \leq N \leq 1000000\)

解题思路

\[\large \prod_{i=1}^N\prod_{j=1}^N\frac{lcm(i,j)}{\gcd(i,j)}\\ \large =\prod_{i=1}^N\prod_{j=1}^N\frac{ij}{\gcd(i,j)^2}\\ \large =\prod_{i=1}^N\prod_{j=1}^Nij *(\prod_{i=1}^N\prod_{j=1}^N\gcd(i,j)^2)^{-1}\\ \large\prod_{i=1}^N\prod_{j=1}^N\gcd(i,j)^2\\ \large =\prod_{d=1}^Nd^{ 2*\sum_{i=1}^{\frac Nd}\sum_{j=1}^{\frac Nd}[\gcd(i,j)=1]}\\ \large =\prod_{d=1}^Nd^{ 2*(2*\varphi(\frac Nd) - 1)}\\ \]

const int N = 1005000;
const int P = 104857601;
bool e[N];
int prime[80000];
int phi[N], tot, n;

ll fpw(ll x, ll mi) {
	ll res = 1;
	while (mi) {
		if (mi & 1) res = res * x % P;
		x = x * x % P, mi >>= 1;
	}
	return res;
}

void prework(int N) {
	for (int i = 2;i <= N; i++) {
		if (!e[i]) prime[++tot] = i, phi[i] = i - 1;
		for (int j = 1;j <= tot && prime[j] * i <= N; j++) {
			int t = prime[j] * i; e[t] = 1;
			if (i % prime[j] == 0) { phi[t] = phi[i] * prime[j]; break; }
			phi[t] = phi[i] * (prime[j] - 1);
		}
		phi[i] = (phi[i] + phi[i-1]) % (P - 1);
	}
}

int main() {
	read(n); prework(n);
	ll ans = 1, res = 1;
	for (int i = 1;i <= n; i++) 
		res = res * i % P, ans = ans * fpw(i, (2 * phi[n/i] + 1) % (P - 1)) % P;
	write(fpw(res, 2 * n % (P - 1)) * fpw(ans * ans % P, P - 2) % P);
	return 0;
}

posted @ 2020-06-10 20:34  Hs-black  阅读(166)  评论(0编辑  收藏  举报