• 【LightOJ


    Description
    我们定义了一个函数,这个函数的定义如下:

    对任意,等于所有的数量,其中lcm为最小公倍数。

    现在给你一组数,你需要去求所有的f(n)。

    Input
    第一行为一个正整数T,。

    然后有T行,每一行有一个整数n,。

    Output
    输出有T行,每一行,输出对应的的值。

    Sample Input
    1

    9

    4

    114

    514

    1919

    810

    Sample Output
    3

    14

    5

    5

    41

    Hint
    对第一组样例,有(1,9),(3,9),(9,9)三组

    首先,根据算术基本定理:一个数的每一个质因子的不同幂对应不同的因数。
    算术基本定理可表述为:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积N=P1^a1 *P2^a2*P3^a3……Pn^an,这里P1 < P2 < P3…… < Pn均为质数,其中指数ai是正整数。这样的分解称为 N 的标准分解式。
    这里写图片描述
    这里写图片描述

    因此我们通过分解质因子,得到质因子的幂次后,对质因子的幂次进行重新组合,保证每个质因子幂次拆分后能得到max(bi,ci)=ai,即可得到多对因子,这也就是求lcm(i,j)=n的对数。
    期间我们要对幂次的组合+1,表示本身,并*2,表示两个因子交换同一质因子的幂次。
    对于得到的每种组合,进行数量的累乘,最后得到的结果还必须做÷2操作,因为可能存在重复的幂次,会得到相同的因数。+1操作是为了防止奇数项质因子被除去。+1后再除,偶数结果不受影响,奇数结果不会被舍去。
    代码如下:

    #include<stdio.h>///算术基本定理
    #include<string.h>
    #define LL long long
    const int maxn=10000100;
    int num=0;
    LL prime[maxn/10],cnt;
    bool vis[maxn];
    int mi[2000],pi[1900];
    void init()
    {
        memset(vis,true,sizeof(vis));
        for(int i=2;i<maxn;i++)
        {
            if(vis[i])prime[num++]=i;
            for(int j=0;j<num&&i*prime[j]<maxn;j++)
            {
                vis[i*prime[j]]=false;
                if(i%prime[j]==0) break;
            }
        }
    }
    void breakperime(LL x)///分解质因数
    {
        memset(mi,0,sizeof(mi));
        memset(pi,0,sizeof(pi));
        cnt=0;
        for(LL i=0;prime[i]*prime[i]<=x;i++)
        {
            if(x%prime[i]==0)
            {
                pi[cnt]=prime[i];
                while(x%prime[i]==0)
                {
                    mi[cnt]++;
                    x/=prime[i];
                }
                cnt++;
            }
        }
        if(x!=1)pi[cnt]=x,mi[cnt++]=1;
    }
    int main()
    {
        int t,cas=0;
        LL n;
        init();
        scanf("%d",&t);
        while(t--)
        {
            scanf("%lld",&n);
            breakperime(n);
            LL sum=1;
            for(LL i=0;i<cnt;i++) sum=sum*(mi[i]*2+1);
            sum=(sum+1)/2;
            printf("%lld
    ",sum);
        }
    }
    
  • 相关阅读:
    使用javaDate类代数据仓库维度表
    Hermes和开源Solr、ElasticSearch 不同
    MapReduce 异常 LongWritable cannot be cast to Text
    吐槽CSDN编辑
    Codeforces 452A Eevee
    看不清楚未来,请做好如今
    JDBC数据库连接
    mixpanel实验教程(2)
    使用jquery+一般处理程序异步载入信息
    Eclipse中的Maven项目报Unbound classpath variable错误
  • 原文地址:https://www.cnblogs.com/kuronekonano/p/11135811.html
Copyright © 2020-2023  润新知