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

来源:互联网 发布:淘宝动漫周边店 编辑:程序博客网 时间:2024/05/22 11:55

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


原创粉丝点击