您的位置:首页 > 其它

Lightoj1028 欧拉函数

2017-02-05 14:59 253 查看

题意

一个十进制数1≤n≤1012,现在用base进制来表示,问有多少种表示方法使得最后一位上的数为0?

等同于求出n有多少种约数,即n%base==0;

思路

开始想的是枚举sqrt内的数,TLE了,因为有10000组数据。。。。

有一个表达式x=px11∗px22∗px33...其中pi是素数,xi为正整数,这样我们就能算出约数的个数了。。。

answer=(x1+1)∗(x2+1)∗...−1

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int nCase = 0;
const long long maxn = 1e6 + 10;
long long prime[maxn];
bool vis[maxn];
//prime[0]记录素数的个数,素数从prime[1]开始存
inline void init() {
memset(vis, false, sizeof vis);
for (long long i = 2;i < maxn;++i) {
if (!vis[i]) {
for (long long j = i * i;j < maxn;j += i)
vis[j] = true;
prime[++prime[0]] = i;
}
}
}
int main(int argc, const char * argv[])
{
// freopen("/Users/jamesqi/Desktop/in.txt","r",stdin);
// freopen("/Users/jamesqi/Desktop/out.txt","w",stdout);
// ios::sync_with_stdio(false);
// cout.sync_with_stdio(false);
// cin.sync_with_stdio(false);
init();
int kase;cin >> kase;
while(kase--) {
long long n;cin >> n;
long long ans = 1;
long long num = n;
for (int i = 1;i <= prime[0] && prime[i] * prime[i] <= num;++i) {
if (num % prime[i] == 0) {
int temp = 0;
while(num % prime[i] == 0) {
++temp;
num /= prime[i];
}
ans *= (temp + 1);
}
}
// ans *= 2;
if (num > 1) ans *= 2; // ans *= (1 + 1);
//ans - 1 because of the basic number 1
printf("Case %d: %lld\n", ++nCase, ans - 1);
}

// showtime;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  欧拉函数