题目:Trailing Zeroes (I) LightOJ - 1028 

题意:概括题意给你一个数字n,就是问你有多个可以被n整除的。

思想:看到题意我们很容易想到唯一分解定理,n = (p1^e1)*(p2^e2)*(p3^e3).....,那么我们根据唯一分解定理求出n的因子的个数,但是如果你直接求的话,时间会超时,所以需要素数筛,把素数筛出来。

代码:

#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int maxn = 1e6;
int pri[maxn], vis[maxn];
int cn;
void Prime(){
     for(int i = 2; i <= maxn; i++){
        if(!vis[i])pri[cn++] = i;
        for(int j = 1; j < cn && i*pri[j]<maxn; j++){
            vis[pri[j]*i] = 1;
            if(i % pri[j] == 0)break;
        }
     }
}
LL Eulor(LL x){
     LL ans = 1, cnt = 0;
     for(int i = 1; pri[i]*pri[i] <= x && i < cn; i++){
         if(x % pri[i] == 0){
            int cnt = 0;
            while(x % pri[i] == 0){
                x /= pri[i];
                cnt++;
            }
            ans *= (cnt+1);
         }

     }
     if(x > 1)ans *= 2;
     return ans-1;
}
int main(){
    int T;
    cn = 1;
    Prime();
    //for(int i = 1; i <=100; i++)cout<<pri[i]<<" ";
    cin>>T;
    int cnt = 0;
    while(T--){
        LL n;
        cin>>n;
        printf("Case %d: %lld\n", ++cnt, Eulor(n));
    }
return 0;
}

 

posted on 2019-03-27 17:21  Refused  阅读(53)  评论(0)    收藏  举报