HDU 3501 Calculation 2 【容斥定理】
2018-01-21 20:41
267 查看
传送门
// 题意: 给定一个n问1-n中与n不互质的数的和是多少.
// 那么1-n中与n不互质的数那么就是n的素因子的倍数(不是素因子的也一定是其中的某个素因子的倍数), 的和, 假设n = 6, 它的素因子为2, 3, 那么我们算一遍2的会算2, 4, 6, 算3的会算3, 6, 6 就算重了一遍, 所以显然就要用容斥定理了, 枚举下所有素因子的组合情况就是了. 然后求和可以直接套用等差数列的公式即可.
比如2 就等于 ans += 2 ^ (1+2+…+n/2), 后面就是一个等差数列….
AC Code
// 题意: 给定一个n问1-n中与n不互质的数的和是多少.
// 那么1-n中与n不互质的数那么就是n的素因子的倍数(不是素因子的也一定是其中的某个素因子的倍数), 的和, 假设n = 6, 它的素因子为2, 3, 那么我们算一遍2的会算2, 4, 6, 算3的会算3, 6, 6 就算重了一遍, 所以显然就要用容斥定理了, 枚举下所有素因子的组合情况就是了. 然后求和可以直接套用等差数列的公式即可.
比如2 就等于 ans += 2 ^ (1+2+…+n/2), 后面就是一个等差数列….
AC Code
vector<int>ve; void rongchi(ll n) { int m = n; ve.clear(); for (int i = 2 ; i*i <= n ; i ++) { if (m % i == 0) { ve.push_back(i); while(m % i == 0) m /= i; } } if (m != 1) ve.push_back(m); ll ans = 0; for (int i = 1 ; i < (1<<ve.size()) ; i ++) { ll tot = 1; int cnt = 0; for (int j = 0 ; j < ve.size() ; j ++) { if (i & (1<<j)) { tot *= ve[j]; cnt++; } } ll tmp = n / tot; if (cnt & 1) { ans += tot*(tmp*(tmp-1)/2); } else ans -= tot*(tmp*(tmp-1)/2); } cout << ans%mod << endl; } void solve() { ll n ; while(cin >> n && n) { rongchi(n); } }
相关文章推荐
- HDU 3501-Calculation 2(欧拉函数)
- hdu 3501 Calculation 2
- hdu 3501 Calculation 2(<n且与n不互质的数之和)
- HDU 3501 Calculation 2 (欧拉函数)
- HDU 3501 Calculation 2
- hdu 3501 Calculation 2
- hdu 5213 Lucky(莫队算法分块+容斥定理)
- Hdu 3501 Calculation 2
- hdu 3501 Calculation 2
- hdu 1796 How many integers can you find 容斥定理
- hdu 4407 容斥定理
- hdu 3501 Calculation 2(<n且与n不互质的数之和)
- hdu 4366 Card Collector(组合数学:容斥定理)
- HDU1796 How many integers can you find[容斥定理]
- HDU 1796How many integers can you find(简单容斥定理)
- hdu 1796 How many integers can you find 容斥定理 位运算 dfs
- hdu 3501 Calculation 2(<n且与n不互质的数之和)
- HDU 3501 Calculation 2 ——Dirichlet积
- HDU-#3501 Calculation 2(欧拉函数+容斥原理)
- HDU 1796How many integers can you find(简单容斥定理)