zoukankan      html  css  js  c++  java
  • 中山大学校队内部选拔赛试题3.1【Factorial Factors】--------2015年2月9日

    一:题目大意

    当给定一个数时,先求出它的所有因子N1,N2······Nk,然后求出它的因子对应的因子的个数n1,n2·····nk,并求出最终结果S=n1^3+n2^3+n3^3+·····+nk^3.

    二:题目分析

    本题的数据范围是N<2^31。如果对于每一趟直接判断时间复杂度将会很高。因此我们需要做预处理,先求出在最大范围内所有的质数。

    对于每一个质数p,它的因子只有1和p本身,那么S(p)=1+2^3=9.

    对于数字x=p^k,我们可以得知它有1,p,,,,p^k这么多因子,那么S(x)=1+2^3+······+(k+1)^3.

    我们首先定义n(x)表示x的因子个数。如果N有两个不同的素因子p1和p2,这时不妨设N=p1^k1*p2^k2.这时我们可以得出一个事实:

    n(p1^i*p2^j)=(j+1)n(p1^i)。

    则很容易得到:

    S(N)=S(p1^k1)+S(p2*p1^k1)+S(p2^2*p1^k1)+····+S(p2^k2*p1^k1)

    下面我们继续往后推论:

    采用类似的方法我们可以得出对于任意

    我们有:

        

    分析到这里我们可以着手写代码了。

    三 :AC代码

    #include<iostream>
    #include<vector>
    using namespace std;
    int isprime[1<<16];
    const int maxi=1<<16;
    vector<int>p;
    void pre()
    {
        for(int i=2;i<maxi;i++)
            if(!isprime[i])
        {
            for(int k=i+i;k<maxi;k+=i)
            {
                isprime[k]=1;
            }
            p.push_back(i);
        }
    }
    int cal(int N)
    {
        int ans=1;
        int i=0;
        while(p[i]*p[i]<=N&&i<p.size())
        {
            if(N%p[i]==0)
            {
                int k=1;
                int j=1;
                while(N%p[i]==0)
                {
                    k++;
                    j+=k*k*k;
                    N/=p[i];
                }
                ans*=j;
            }
            i++;
        }
        if(N!=1) ans*=9;
        return ans;
    }
    int main()
    {
        int T;
        pre();
        cin>>T;
        int n;
        while(T--)
        {
            cin>>n;
            cout<<cal(n)<<endl;
        }
        return 0;
    }

    四:学会合理运用数字之间的关系转化问题是解题的关键。

  • 相关阅读:
    记录下python学习中,容易弄混和实用的知识点
    操作系统简史
    计算机结构
    计算机结构
    电脑简史
    电脑简史
    为什么学Python
    为什么学Python
    树莓派更换更新国内源
    树莓派更换更新国内源
  • 原文地址:https://www.cnblogs.com/khbcsu/p/4282643.html
Copyright © 2011-2022 走看看