hust1720-Rent House-2017华科现场赛J题-莫比乌斯反演
2017-05-22 11:24
239 查看
题目链接:http://acm.hust.edu.cn/problem/show/1720
题意:给你n*m个数(1<=n,m<=100),每个数不大于10000,问你有多少组(a,b,c,d)满足gcd(a,b,c,d)==1。PS:(1,2,3,4)和(2,1,3,4)是同一组。
题解:可以说是一个裸的莫比乌斯反演。因为我们直接求gcd(a,b,c,d)==1的组数不好快速求解,而时限只有1s。但是当我们求其倍数即gcd(a,b,c,d)==1*k的组数时更好求解(只需知道k的倍数num就可得出答案C4num)。
所以我们直接用莫比乌斯反演:设f(x)为gcd(a,b,c,d)==x的组数,F(x)为gcd(a,b,c,d)==k*x的组数,设有num个数是x的倍数,所以F(x)=C4num。
根据莫比乌斯反演公式:
f(x)=∑x|dμ(dx)∗F(d)
f(1)即所求答案,设x=1,ma为给出数中最大值,那么
ans=∑mai=1mu[i]∗F(i)
把前面我写的莫比乌斯反演看懂了,这题应该很快就能做出来。
题意:给你n*m个数(1<=n,m<=100),每个数不大于10000,问你有多少组(a,b,c,d)满足gcd(a,b,c,d)==1。PS:(1,2,3,4)和(2,1,3,4)是同一组。
题解:可以说是一个裸的莫比乌斯反演。因为我们直接求gcd(a,b,c,d)==1的组数不好快速求解,而时限只有1s。但是当我们求其倍数即gcd(a,b,c,d)==1*k的组数时更好求解(只需知道k的倍数num就可得出答案C4num)。
所以我们直接用莫比乌斯反演:设f(x)为gcd(a,b,c,d)==x的组数,F(x)为gcd(a,b,c,d)==k*x的组数,设有num个数是x的倍数,所以F(x)=C4num。
根据莫比乌斯反演公式:
f(x)=∑x|dμ(dx)∗F(d)
f(1)即所求答案,设x=1,ma为给出数中最大值,那么
ans=∑mai=1mu[i]∗F(i)
把前面我写的莫比乌斯反演看懂了,这题应该很快就能做出来。
#include <bits/stdc++.h> using namespace std; #define time_ (printf("%.6f\n", double(clock())/CLOCKS_PER_SEC)) typedef long long ll; const int INF = 0x3f3f3f3f; const double pi = acos(-1.0); const int maxn = 1e4+5; int vis[maxn],prime[maxn],mu[maxn]; int sz[maxn],cnt[maxn]; //cnt[]为1-10000每个数的个数,sz[]为1-10000每个数的倍数的个数 void Moblus() //计算莫比乌斯函数的值 { memset(vis,0,sizeof(vis)); int num=0; mu[1]=1; for(int i=2;i<maxn;i++) { if(!vis[i]) { prime[num++]=i; mu[i]=-1; } for(int j=0;j<num && i*prime[j]<maxn;j++) { vis[prime[j]*i]=1; if(i%prime[j]==0) { mu[prime[j]*i]=0; break; } else mu[prime[j]*i]=-mu[i]; } } } ll solve(int x) { memset(sz,0,sizeof(sz)); for(int i=1;i<=x;i++) //求每个数倍数的个数 { for(int j=i;j<=x;j+=i) { sz[i] += cnt[j]; } } ll ans=0; for(int i=1;i<=x;i++) { if(sz[i]>=4) //如果倍数个数大于4,即可用排列组合计算F(i),否则组数为0 { ans += (ll)mu[i]*sz[i]*(sz[i]-1)*(sz[i]-2)*(sz[i]-3)/24; } } return ans; } int main() { int n,m,tmp,ma; Moblus(); while(~scanf("%d%d",&n,&m)) { memset(cnt,0,sizeof(cnt)); ma=0; for(int i=0;i<n*m;i++) { scanf("%d",&tmp); ++cnt[tmp]; ma = max(ma,tmp); } if(n*m<4) printf("0\n"); else printf("%lld\n",solve(ma)); } return 0; }
相关文章推荐
- HUST1579-Portal BFS+状态压缩 2017华科现场赛-C
- BZOJ 4816 [Sdoi2017]数字表格 ——莫比乌斯反演
- 洛谷3704 [SDOI2017] 数字表格 【莫比乌斯反演】
- 【bzoj4816】[Sdoi2017]数字表格 莫比乌斯反演
- BZOJ4816 [Sdoi2017]数字表格 【莫比乌斯反演】
- [分块 莫比乌斯反演] BZOJ 4815 [Cqoi2017]小Q的表格
- HDU 6134 Battlestation Operational 2017多校8 莫比乌斯反演
- [莫比乌斯反演] BZOJ4816: [Sdoi2017]数字表格
- [莫比乌斯反演] HDU6053: [2017 多校-第2场] TrickGCD
- bzoj 4816: [Sdoi2017]数字表格 莫比乌斯反演
- bzoj 4815: [Cqoi2017]小Q的表格 分块+莫比乌斯反演
- 【jzoj5337】【NOIP2017提高A组模拟8.25】【夜莺与玫瑰】【莫比乌斯反演】
- [莫比乌斯反演] BZOJ 4816 [Sdoi2017]数字表格
- [数位DP 莫比乌斯反演] 2017 计蒜之道 复赛 A. 阿里云秘钥池
- 【BZOJ4816】【SDOI2017】数字表格 [莫比乌斯反演]
- BZOJ 2693: jzptab [莫比乌斯反演 线性筛]
- 51nod 1675 序列变换 莫比乌斯反演
- 2017沈阳站现场赛A题
- BZOJ2154+BZOJ2693 Crash的数字表格&jzptab-莫比乌斯反演
- 莫比乌斯反演