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