S
o
l
u
t
i
o
n
\mathcal{Solution}
Solution
假设 最大完全平方数 为
x
2
x^2
x2,
p
p
p 为 质数,
x
2
=
(
p
1
a
1
/
2
∗
p
2
a
2
/
2
.
.
∗
p
n
a
n
/
2
)
2
x^2 = (p_1^{a_1/2}*p_2^{a_2/2}..*p_n^{a_n/2})^2
x2=(p1a1/2∗p2a2/2..∗pnan/2)2
右式括号中的乘积 即 [ 1 , N ] [1, N] [1,N] 中若干数字的乘积,
相当于将 [ 1 , N ] [1,N] [1,N] 中若干数字分解质因数, 再 相乘,
此时要以 指数 a n % 2 = = 0 a_n\%2==0 an%2==0为前提, 来保证 答案最大
于是将 合数的所有质因子 相乘得到
p
1
a
1
∗
p
2
a
2
.
.
∗
p
n
a
n
p_1^{a_1}*p_2^{a_2}..*p_n^{a_n}
p1a1∗p2a2..∗pnan
若其中存在
a
i
%
2
=
=
1
a_i\%2==1
ai%2==1, 使用对应 质数 去乘它 保证
a
n
%
2
=
=
0
a_n\%2==0
an%2==0 即可.
C
o
d
e
\mathcal{Code}
Code
#include<bits/stdc++.h>
#define reg register
const int maxn = 5000005;
const int mod =100000007;
int N;
int cnt;
int Pre[maxn];
int prm[maxn];
int Cnt[maxn];
bool Used[maxn];
int KSM(int a, int b){
int s = 1;
while(b){
if(b & 1) s = 1ll*s*a % mod;
a = 1ll*a*a % mod;
b >>= 1;
}
return s;
}
int main(){
scanf("%d", &N);
for(reg int i = 2; i <= N; i ++){
if(!Used[i]) prm[++ cnt] = i;
for(reg int j = 1; j <= cnt && prm[j]*i <= N; j ++){
Pre[prm[j]*i] = i, Used[prm[j]*i] = 1;
if(i % prm[j] == 0) break ;
}
}
for(reg int i = 1; i <= N; i ++) Cnt[i] = 1;
for(reg int i = N; i >= 1; i --){
if(!Used[i]) continue ;
Cnt[Pre[i]] += Cnt[i];
Cnt[i/Pre[i]] += Cnt[i], Cnt[i] = 0;
}
int Ans = 1;
for(reg int i = 1; i <= cnt; i ++)
Ans = 1ll*Ans*KSM(prm[i], Cnt[prm[i]]>>1) % mod;
printf("%d\n", (int)(1ll*Ans*Ans%mod));
return 0;
}