您的位置:首页 > 其它

hdu3501 欧拉函数(或容斥原理(莫比乌斯函数))

2017-08-11 22:28 309 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3501

题解1:显然,本体可以用容斥原理,求出每个数的倍数情况,其系数就是莫比乌斯函数。

题解2:对于整数n,如果x(x<n)与n互质,那么(n-x)也与n是互质的;同理如果x(x<n)与n不互质,那么(n-x)也与n是不互质的。知道这个之后就可以得出:在0<x<n时,存在这样的x与n互质的个数假设为num(可以通过欧拉函数求得),那么所有与n互质的x的和sum=num*n/2.

题解2代码如下:

#include  <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e5 + 10;
const int MOD = 1000000007;
int primes[maxn],pcnt;
int vis[maxn];
ll n;
void get_prime(int n){
vis[1] = 1;
for(int i = 2;i <= n;i++){
if(!vis[i]) primes[++pcnt] = i;
for(int j = 1;j <= pcnt && primes[j] * i <= n;j++){
vis[i * primes[j]] = 1;
if(i % primes[j] == 0) break;
}
}
}
int main()
{
get_prime(maxn - 10);
while(~scanf("%lld",&n) && n){
ll phi = n,tmp = n;
for(int i = 1;i <= pcnt;i++){
ll t = primes[i];
if(t * t > n) break;
if(n % t == 0) {
phi = phi / t * (t - 1);
while(n % t == 0) n/=t;
}
}
if(n > 1) phi = phi / n * (n - 1);
ll ans = (long long)phi * tmp / 2;
ans = (tmp * (tmp - 1)) / 2 - ans;
printf("%lld\n",ans % MOD);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm