Trailing Zeroes (I) LightOJ

题意就是给你一个数让你找它的正因子个数(包括自身,不包括1),这个地方用到一个公式,如果不用的话按正常思路来写会TL什么的反正就是不容易写对。

求任意一个大于1的整数的正因子个数

首先任意一个数n,n=P1^a1 * P2^a2 * P3^a3 *……Pn^an;

任意的整数n可以分解为m个素数ai次幂的连续乘机,这个地方解释不清自己再理解一下(Pi都为素数,依次往后pi越来越大,ai就是次幂,自己可以找几个任意整数n来套一下这个公式就会明白了)

然后正因子个数和:sum=(1+a1)*(1+a2)*(1+a3)……*(1+an);

用这两个公式本题就可以轻松解决啦(这里还是不清楚的就套几个数就理解这两个公式了,是完全正确的哦);

AC代码如下:

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int pri[1000001];
int tt[1000001];
int s=0;
void dabiao() //打个素数表会节省很多时间
{   int j;
    memset(tt,0,sizeof(tt));
    tt[1]=1;
    tt[0]=1;
    for(int i=2;i<=1000000;i++)
    {
        if(tt[i]!=1)
        {
            pri[s++]=i;
            for(j=i+i;j<=1000000;j+=i)
                tt[j]=1;
        }
    }
    return ;
}
int main()
{
    int m,i,j,k,t,cas=0;
    long long n,num,ans;
    scanf("%d",&t);
    dabiao();
    while(t--)
    {
        scanf("%lld",&n);
        num=1;
        for(i=0;i<s&&pri[i]*pri[i]<=n;i++)
        {
            ans=0;
            if(n%pri[i]==0)
            {

                while(n%pri[i]==0)//此处就是来找素数的N次幂,存起来相乘来计算SUM
                {
                    ans++;
                    n/=pri[i];
                }

            }
        num=num*(ans+1);
        }
            if(n>1)//这个地方就不解释啦,自己想想咯
            num*=2;
        printf("Case %d: %lld
",++cas,num-1);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/nr1999/p/8459934.html