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代码如下:
题解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; }
相关文章推荐
- HDU1695:GCD(容斥原理+欧拉函数+质因数分解)好题
- HDU 1695 GCD(容斥原理 + 欧拉函数)
- 容斥原理 和 欧拉函数
- BZOJ 2440: [中山市选2011]完全平方数(二分答案 + 莫比乌斯函数 + 容斥原理)
- 欧拉函数+莫比乌斯函数 模板
- HDU 1695 GCD ★(容斥原理+欧拉函数)
- HDU1695素数打表欧拉函数容斥原理(再看)
- hdu 3501 容斥原理或欧拉函数
- Smith Numbers(欧拉函数,容斥原理)
- 容斥原理 && 欧拉函数 && 抽屉原理 总结
- HDU 1695 GCD ★(容斥原理+欧拉函数)
- 数论模版-欧拉函数、莫比乌斯函数和素数
- 数论 毕达哥斯拉三元组 + 欧拉函数 + 容斥原理 hdu3939
- BZOJ 2440: [中山市选2011]完全平方数( 二分答案 + 容斥原理 + 莫比乌斯函数 )
- Hdu 5514 类莫比乌斯函数 容斥原理
- hdu 1286 找新朋友 (容斥原理 || 欧拉函数)
- HDOJ 题目1695 GCD(欧拉函数,容斥原理)
- hdu1695 GCD(容斥原理+欧拉函数)
- O(n)求素数,求欧拉函数,求莫比乌斯函数,求对mod的逆元,各种求
- HDU 1695-GCD(容斥原理+欧拉函数)