njust oj triple 莫比乌斯反演
2016-04-19 17:19
337 查看
分析:令f(x)为1到n的gcd(i,j)==x的个数
F(x)为1到n的x|gcd(i,j)的对数
显然F(n)=∑n|df(d)
然后由莫比乌斯反演可得f(n)=∑n|d μ(d/n)*F(d)
由题目显然可得,令cnt=n/x,当cnt<3时,F(x)为0,cnt>=3,F(x)=cnt*(cnt-1)*(cnt-2)/6
然后就是暴力,复杂度,O(T*n)
注:题目链接https://icpc.njust.edu.cn/Problem/Local/1923/
View Code
F(x)为1到n的x|gcd(i,j)的对数
显然F(n)=∑n|df(d)
然后由莫比乌斯反演可得f(n)=∑n|d μ(d/n)*F(d)
由题目显然可得,令cnt=n/x,当cnt<3时,F(x)为0,cnt>=3,F(x)=cnt*(cnt-1)*(cnt-2)/6
然后就是暴力,复杂度,O(T*n)
注:题目链接https://icpc.njust.edu.cn/Problem/Local/1923/
#include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> using namespace std; typedef long long LL; const int N=1e5+5; int n,m,T,prime ,mu ; bool vis ; void getmu() { mu[1] = 1; int cnt = 0; for(int i=2; i<=N-5; i++) { if(!vis[i]) { prime[cnt++] = i; mu[i] = -1; } for(int j=0; j<cnt&&i*prime[j]<=N-5; j++) { vis[i*prime[j]] = 1; if(i%prime[j]) mu[i*prime[j]] = -mu[i]; else { mu[i*prime[j]] = 0; break; } } } } LL F(int x){ LL tmp=n/x; if(tmp<3)return 0; return tmp*(tmp-1)/2*(tmp-2)/3; } int main(){ getmu(); scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); LL ans=0; for(int i=1;i*m<=n;++i){ ans+=mu[i]*F(i*m); } printf("%lld\n",ans); } return 0; }
View Code
相关文章推荐
- 小问题快速处理
- 枚举的创建和描述文本的获取
- 203. Remove Linked List Elements
- bzoj 1067 [SCOI2007]降雨量
- 快速排序(Quicksort)的Javascript实现
- Android 桌面图标消息数提醒
- Callable和Future
- 博弈
- Android知识补漏
- Android解决ViewPager嵌套Fragment,Fragment嵌套ViewPager滑动冲突
- IP相关工具类
- Java小程序之用*打印正/倒立三角形
- mysql--sql查询练手
- 指针运算
- iOS 点滴积累
- 每天一道算法题(六)深度优先算法(DFS)学习及Java实现
- 转:在线流程图制做网站
- sql过滤掉重复记录,只保留一条数据
- [网络流24题] 最长递增子序列 (最多不相交路径---网络最大流)
- 八皇后问题 DFS