zoukankan      html  css  js  c++  java
  • 完全平方数 [质数相关计数问题]

    感谢 JR, YR 赞助


    Solutionmathcal{Solution}

    假设 最大完全平方数x2x^2, pp质数,

    x2=(p1a1/2p2a2/2..pnan/2)2x^2 = (p_1^{a_1/2}*p_2^{a_2/2}..*p_n^{a_n/2})^2

    右式括号中的乘积 即 [1,N][1, N] 中若干数字的乘积,

    相当于将 [1,N][1,N] 中若干数字分解质因数, 再 相乘,

    此时要以 指数 an%2==0a_n\%2==0为前提, 来保证 答案最大

    于是将 合数的所有质因子 相乘得到 p1a1p2a2..pnanp_1^{a_1}*p_2^{a_2}..*p_n^{a_n}
    若其中存在 ai%2==1a_i\%2==1, 使用对应 质数 去乘它 保证 an%2==0a_n\%2==0 即可.


    Codemathcal{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
    ", (int)(1ll*Ans*Ans%mod));
            return 0;
    }
    
  • 相关阅读:
    Swing编程基础 之二
    数据库有几种
    世界上所有的电脑操作系统
    Linux基础命令-有关于目录的命令
    Oracle Flashback 闪回
    Linux CentOS6.5下安装Oracle ASM
    如何将U盘内文件拷入VMware Linux CentOS6.5虚拟机
    iptables 开启端口
    在Oracle SQLplus下建用户 建表
    Linux CentOS中使用SQL*Plus启动和关闭数据库
  • 原文地址:https://www.cnblogs.com/zbr162/p/11822618.html
Copyright © 2011-2022 走看看