zoukankan      html  css  js  c++  java
  • 完全平方数最大

    问题描述:
    从1 − N中找一些数乘起来使得答案是一个完全平方数,求这个完全平方数
    最大可能是多少。
    输入格式:
    第一行一个数字N。
    输出格式:
    一行一个整数代表答案对100000007取模之后的答案。
    样例输入:
    7
    样例输出:
    144
    样例解释:
    但是塔外面有东西。
    数据规模与约定:
    对于20%的数据, 1 ≤ N ≤ 100。
    对于50%的数据, 1 ≤ N ≤ 5000。
    对于70%的数据, 1 ≤ N ≤ 105。
    对于100%的数据, 1 ≤ N ≤ 5 × 106。
    思路:
    对于n的阶乘质因数分解后
    如果一个素数次数是奇数那么不选这个素数
    否则选这个素数
    这样就能保证最大并且不会出现一个数的一部分选一部分不选的情况
    因为不选的一定是素数

    #include<iostream>
    #include<cstdio>
    #define lon unsigned long long
    using namespace std;
    const int maxn=5000010;
    const int mod=100000007;
    lon n,tot,ans=1,c[maxn],prime[maxn];
    bool flag[maxn];
    void prepare()
    {
        for(int i=2;i<=n;i++)
        if(!flag[i])
        {
            prime[++tot]=i;
            for(int j=i+i;j<=n;j+=i)
            flag[j]=1;
        }
    }
    void jie()//对于结成分解质因数***
    {
        for(int i=1;i<=tot;i++)
        {
            lon tmp=n;
            while(tmp)
            {
                c[i]+=tmp/prime[i];
                tmp/=prime[i];
            }
        }
    }
    lon quick_power(lon x,lon y)
    {
        lon tmp=1;
        while(y)
        {
            if(y&1)
            tmp=tmp*x%mod;
            x=x*x%mod;
            y>>=1;
        }
        return tmp%mod;
    }
    int main()
    {
        freopen("hao.in","r",stdin);
        freopen("hao.out","w",stdout);
        cin>>n;
        prepare();
        jie();
        for(int i=1;i<=tot;i++)
        ans=(ans*quick_power(prime[i],c[i]/2*2)%mod)%mod;
        cout<<ans;
        fclose(stdin);fclose(stdout);
        return 0;
    }
  • 相关阅读:
    【计算机网络】网络地址转换NAT
    红黑树
    引用和取地址区别
    [网络编程] TCP、UDP区别以及TCP传输原理、拥塞避免、连接建立、连接释放总结
    操作系统大端模式和小端模式
    点乘和叉乘
    HMM模型
    Application_Start
    跨函数使用内存空间
    框架
  • 原文地址:https://www.cnblogs.com/cax1165/p/6070905.html
Copyright © 2011-2022 走看看