HDU 1695 GCD(容斥 or 莫比乌斯反演)
来源:互联网 发布:淘宝网怎么卖闲置 编辑:程序博客网 时间:2024/05/29 11:14
这题可以用容斥做,然而效率并不高。。
于是学了下莫比乌斯反演(资料百度找)
求出mo数组后
设f(x)为gcd为x的种数
F(x)为gcd为x倍数的种数
那么显然F(x) = (b / x) * (d / x)
莫比乌斯反演之后,得到f(x) = sum(mo[i] * F(i))。
然后还要容斥减去对称重复的。对称重复的情况为min(b, d)小的中,求一遍除2,(因为存在x = y的情况只有(1,1)一种)
最后还要注意特判下k == 0的情况
代码:
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 100005;int mo[N], prime[N], pn;bool vis[N];void Moblus() { memset(vis, false, sizeof(vis)); mo[1] = 1; pn = 0; for(int i = 2; i < N; i++) { if(!vis[i]) { prime[pn++] = i; mo[i] = -1; } for(int j = 0; j < pn; j++) { if(i * prime[j] >= N) break; vis[i * prime[j]] = true; if(i % prime[j] == 0) { mo[i * prime[j]] = 0; break; } else mo[i * prime[j]] = -mo[i]; } }}typedef long long ll;int t, a, b, c, d, k;int main() { Moblus(); int cas = 0; scanf("%d", &t); while (t--) { scanf("%d%d%d%d%d", &a, &b, &c, &d, &k); if (k == 0) { printf("Case %d: 0\n", ++cas); continue; } b /= k; d /= k; if (b > d) swap(b, d); ll ans = 0; for (int i = 1; i <= b; i++) ans += (ll)mo[i] * (b / i) * (d / i); ll tmp = 0; for (int i = 1; i <= b; i++) tmp += (ll)mo[i] * (b / i) * (b / i); printf("Case %d: %I64d\n", ++cas, ans - tmp / 2); } return 0;}
1 0
- HDU 1695 GCD(容斥 or 莫比乌斯反演)
- HDU 1695 GCD 容斥原理/莫比乌斯反演
- hdu 1695 GCD 欧拉函数+容斥 ||莫比乌斯反演
- HDU 1695 GCD (容斥 + 莫比乌斯反演)
- 【HDU1695】GCD(莫比乌斯反演+容斥)
- 【hdu 1695 】GCD 【容斥+欧拉 or mobius反演】
- HDOJ 1695 GCD(容斥+欧拉函数&&莫比乌斯反演+分块)
- HDU 1695 GCD 莫比乌斯,容斥原理
- hdu 6053 (莫比乌斯反演+容斥)
- HDU-1695-GCD(莫比乌斯反演)
- hdu 1695 GCD(莫比乌斯反演)
- hdu 1695 GCD 莫比乌斯反演
- HDU 1695 GCD(莫比乌斯反演)
- HDU 1695 GCD(莫比乌斯反演)
- HDU 1695 GCD【莫比乌斯反演】
- HDU 1695 GCD [莫比乌斯反演]
- HDU 1695 GCD(莫比乌斯反演)
- HDU 1695 GCD (莫比乌斯反演)
- PHP接口类interface的正确使用方法
- Java date format 时间格式化
- Maven配置nexus
- spring security控制权限的方法
- leetcode之Reverse Integer
- HDU 1695 GCD(容斥 or 莫比乌斯反演)
- 解题报告 之 POJ2455 Secret Milking Machine
- makefile 特殊字符 二
- [leetcode]Combination Sum
- spring batch介绍(一)
- HTML第十四节(页面布局基础一)
- 各种排序的稳定性和时间复杂度
- 《Linux中断编程》中断处理底半部
- Android怎样播放多张图片形成一个动画