莫比乌斯反演-ACdream-1117
来源:互联网 发布:ipc h10网络摄像机 编辑:程序博客网 时间:2024/05/18 08:31
题目链接:
http://acdream.info/problem?pid=1114
题意:
给定一个序列,求序列中互质的数的对数。
分析:
我们设f(d) 表示gcd恰好为d的数的个数,F(d)表示gcd为d的倍数的个数
因此,F(d) = sigma (f(n)) (n%d==0)
f(n)= sigma( mu[d]*F[n/d] ) (n%d==0);
因此我们先统计出每个数出现的频数num;
然后用cnt[i]表示i的倍数的个数。
F(i) = C(cnt[i],2);
我们最终要求的结果就是f(1);
#include<bits/stdc++.h>#define ll long longconst ll mod=1e9+7;using namespace std;const int maxn=230000;int prime[maxn],isprime[maxn],cnt=0;int fen[maxn],num[maxn];int mu[maxn+10];void init(){ memset(isprime,0,sizeof(isprime)); mu[1]=1; for(int i=2; i<maxn; i++) { if(!isprime[i]) { prime[cnt++]=i,mu[i]=-1; } for(int j=0; j<cnt&&prime[j]*i<maxn; j++) { isprime[prime[j]*i]=1; if(i%prime[j]==0) { mu[prime[j]*i]=0; break; } else { mu[i*prime[j]]=-mu[i]; } } }}int main(){ int n; init(); while(~scanf("%d",&n)) { memset(num,0,sizeof(num));//注意要memset memset(fen,0,sizeof(fen)); int ma=-1; int x; for(int i=0; i<n; i++) { scanf("%d",&x); num[x]++; ma=max(ma,x);//记录最大值,不然用maxn会超时 } for(int i=1; i<=ma; i++) for(int j=i; j<=ma; j+=i) { if(num[j])fen[i]+=num[j];//用这种方法分解因子 } ll ans=0; for(int j=1;j<=ma;j++) { ans+=mu[j]*(ll)fen[j]*(fen[j]-1)/2;//莫比乌斯反演 } cout<<ans<<endl; } return 0;}
阅读全文
0 0
- 莫比乌斯反演-ACdream-1117
- Acdream 1117 Number theory(莫比乌斯反演)
- ACdream 1148 GCD SUM 莫比乌斯反演
- ACdream 1114 Number theory (莫比乌斯反演)
- ACdream 1114 Number theory 莫比乌斯反演 或 容斥原理
- 二项式反演,莫比乌斯反演。
- 莫比乌斯反演
- 莫比乌斯反演
- 莫比乌斯反演
- 莫比乌斯反演
- 莫比乌斯反演
- 莫比乌斯反演
- 莫比乌斯反演
- 莫比乌斯反演
- 莫比乌斯反演
- 莫比乌斯反演
- 莫比乌斯反演
- 莫比乌斯反演
- Android之style(样式)和Theme(主题)
- 利用background-attachment做视差滚动效果
- 页面后退键(Backspace)失效JS
- ThreadPoolExecutor机制
- 数据库连接池(DBCP)
- 莫比乌斯反演-ACdream-1117
- 数据库相关的资料汇总
- php版本间区别
- 基于labVIEW 的excle报表生成
- 带有哨兵的双向循环链表
- 简单的json数据分页操作
- ViewDragHelper通用模板代码及应用
- CvMat、Mat、IplImage之间的转换 ***** **
- 谈谈inline-block的几个神奇的用法