HDU1695 GCD(莫比乌斯反演)
2016-02-02 13:41
288 查看
传送门
看了1个多小时,终于懂了一点了
题目大意:给n,m,k.求gcd(x,y) = k(1<=x<=n, 1<=y<=m)的个数
思路:令F(i)表示i|gcd(x,y)的(x,y)的对数,显然F(x)=[nx]∗[mx]。
设f(x)为gcd(x,y)=x的对数。
因为F(x)=∑i|xf(i),所以我们可以莫比乌斯反演它。
根据公式f(x)=∑x|dμ(d)F(d)
我们的目标就是f(1)(因为n和m都可以除以k)
所以我们就可以在O(n)的时间复杂度内求出答案了。
看了1个多小时,终于懂了一点了
题目大意:给n,m,k.求gcd(x,y) = k(1<=x<=n, 1<=y<=m)的个数
思路:令F(i)表示i|gcd(x,y)的(x,y)的对数,显然F(x)=[nx]∗[mx]。
设f(x)为gcd(x,y)=x的对数。
因为F(x)=∑i|xf(i),所以我们可以莫比乌斯反演它。
根据公式f(x)=∑x|dμ(d)F(d)
我们的目标就是f(1)(因为n和m都可以除以k)
所以我们就可以在O(n)的时间复杂度内求出答案了。
#include<cstdio> #include<algorithm> using namespace std; #define MAXN 100005 int n, m, k, miu[MAXN], p[MAXN], cnt; bool vis[MAXN]; void sieve() { miu[1] = 1; for(int i = 2; i < MAXN; ++ i) { if(!vis[i]) { miu[i] = -1; p[++ cnt] = i; } for(int j = 1; j <= cnt; ++ j) { if(p[j] * i > MAXN) break; vis[p[j]*i] = 1; if(i % p[j] == 0) { miu[i * p[j]] = 0; break; } else miu[i * p[j]] = - miu[i]; } } } int main() { sieve(); int T, a, c; scanf("%d", &T); for(int C = 1; C <= T; ++ C) { printf("Case %d: ", C); scanf("%d%d%d%d%d", &a, &n, &c, &m, &k); if(!k) { puts("0"); continue; } n /= k; m /= k; if(n > m) swap(n, m); long long ans1 = 0, ans2 = 0; for(int i = 1; i <= n; ++ i) ans1 += 1LL * miu[i] * (n/i) * (m/i); for(int i = 1; i <= n; ++ i) ans2 += 1LL * miu[i] * (n/i) * (n/i); //因为要求无序的数对,所以我们可以减去ans2/2 ans1 -= ans2/2; printf("%I64d\n", ans1); } }
相关文章推荐
- JavaBean个人总结
- HDU1695 GCD(莫比乌斯反演)
- wc2016总结
- npm如何升级自身
- 【数论】关于乘法逆元的证明
- 监测ceph集群
- 学点经济学知识(三)
- ios往appStore上传项目
- 如何使用SSDT进行SQL数据库的自动化部署到生产环境和版本控制
- 怎样提高团队管理能力2
- WebView内存泄漏
- WPF(C#) 打印各类型文件.
- POJ-2631-Roads in the North-树的直径(最长路)
- 华为机试题:删除字符串中出现次数最少的字符
- 用jQuery编写图片弹幕评论插件
- 京东价格监控软件开发技术探讨四:京东Cookies的获取
- Android Jni开发之创建Jni程序和打印log
- 文章标题
- Quartz1.8.5例子(二)
- IP地址从头说起