LightOJ-1236

来源:互联网 发布:百度快速排名优化公司 编辑:程序博客网 时间:2024/06/07 07:03
///题意很简单明了 就是求一个数n在[1,n]中lcm(i,i)==n(i<=j)的对数;///思路:咋们可以先打一个素数表用唯一分解定理分解出该数因子的个数然后找规律就可以了;///分析一下i,j;(1)得到i和j的最小公倍数的办法是将i和j进行唯一分解,取相同两个因子的幂的最大值作为该因子的幂,进行相乘就可以得到lcm;///若 n=a1^p1*a2^p2*...*am^pm(a1,a2,...,am均为质数);///我们在取pi个ai的时候,pj可以取p(i,i-1,i-2,,,0,),为pi+1个,相反pj个ai时pi可以取pj+1个,和pi的个数相同,所以总数为2*(pi+1)-1种;///举个例子就是1,2,3的排列数为2*3+1;///所以我们在枚举的时候进行相乘就可以了,最后求得是它的对数只需要向上取整除以2就好了;#include<cstdio>#include<cstring>using namespace std;const int maxn=1e7+7;const int maxn1=1e6+7;///卡你内存;typedef long long LL;int prime[maxn1],flag=0;bool vis[maxn];void getprime(){    memset(prime,0,sizeof(prime));    memset(vis,0,sizeof(vis));    for(int i=2;i<=maxn;i++)    {        if(!vis[i])        {            prime[++flag]=i;            for(int j=i*2;j<=maxn;j+=i)                vis[j]=1;        }    }}int main (){    getprime();    int t;    scanf("%d",&t);    LL data;    for(int cas=1;cas<=t;cas++)    {        scanf("%lld",&data);        LL ans=1;        for(int j=1;j<=flag&&prime[j]<=data;j++)        {            LL sum=0;            if(data%prime[j]==0)            {                while(data%prime[j]==0)///唯一分解;计算因子的个数                {                    data/=prime[j];                    sum++;                }            }            ans*=(2*sum+1);        }        if(data>1) ans*=3;///因为打的素数表有限,所以在最后的时候特判一下就好了;        printf("Case %d: %lld\n",cas,(ans+1)/2);    }    return 0;}
原创粉丝点击