Trailing Zeroes (I) LightOJ - 1028 (素数筛+唯一分解定理)

题目: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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值