1. 程式人生 > >Trailing Zeroes (I) LightOJ - 1028

Trailing Zeroes (I) LightOJ - 1028

兩個 tdi clas post 代碼 turn lld 完全 num

題意就是給你一個數讓你找它的正因子個數(包括自身,不包括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\n",++cas,num-1); } return 0; }

Trailing Zeroes (I) LightOJ - 1028