完全平方数 [质数相关计数问题]

感谢 JR, YR 赞助


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/2p2a2/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} p1a1p2a2..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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值