poj3904容斥原理
来源:互联网 发布:yum安装命令 编辑:程序博客网 时间:2024/05/21 08:59
题意:从若干个数中找出a,b,c,d满足gcd(a,b,c,d)=1,求组数。
分析:我们从反面来考虑,即求出有多少组是不满足要求的。
把每个数素数分解,记录不重复素因子所能组成的因子,把这些因子的总数统计,并且统计每个因子是由多少个素因子组成 。
比如:这n个数中只含有2,3这两个质因数,且质因数中含2的有a个,含3的有b个,含6(2*3)的有c个,那么答案便是C(n,4)-(C(a,4)+C(b,4)-C(c,4))。
下面是代码^_^:
#include<cstdio>#include<cstring>using namespace std;const int maxn=10010;typedef long long LL;LL p[maxn];LL count[maxn];LL prime[maxn];LL num[maxn];void init(){ LL i; for(i=4;i<=maxn;i++) p[i]=i*(i-1)*(i-2)*(i-3)/(LL)24;}void solve(LL n){ LL cnt=0; for(LL i=2;i*i<=n;i++){ if(n%i==0) prime[++cnt]=i; while(n%i==0) n/=i; } if(n!=1) prime[++cnt]=n; for(LL i=1;i<(1<<cnt);i++){ LL k=1; LL sum=0; for(LL j=1;j<=cnt;j++){ if(i & (1<<(j-1))){ k*=prime[j]; sum++; } } count[k]++; num[k]=sum; }}int main(){ init(); LL n,i,m; while(scanf("%lld",&n)!=EOF){ memset(count,0,sizeof(count)); for(i=1;i<=n;i++){ scanf("%lld",&m); solve(m); } LL ans=0; for(i=1;i<=maxn;i++){ if(count[i]){ if(num[i]%2) ans+=p[count[i]]; else ans-=p[count[i]]; } } printf("%lld\n",p[n]-ans); } return 0;}
1 0
- 容斥原理 POJ3904
- poj3904 容斥原理
- poj3904 容斥原理
- poj3904容斥原理
- poj3904 Sky Code 容斥原理
- poj3904 Sky Code(容斥原理)
- POJ3904 Sky Code【容斥原理】
- poj3904 Sky Code【容斥原理】
- POJ3904 Sky Code (容斥原理)
- poj3904 容斥原理或莫比乌斯反演
- poj3904 Sky Code------容斥复习
- poj3904 Sky Code —— 唯一分解定理 + 容斥原理 + 组合
- 容斥原理
- 【容斥原理】八
- 【八】容斥原理
- 广义容斥原理
- 容斥原理
- 容斥原理 专题
- POJ-3071-Football
- 长尾狐狸(简单dp)
- Java ArrayList LinkedList
- 25补间动画
- 理解回溯法
- poj3904容斥原理
- [BZOJ3124][Sdoi2013]直径(树形dp)
- Java 之 JDK 的下载,安装,及Java环境配置教程(二)
- 关于AngularJs的ng-repeat
- 通过环境变量修改java版本不生效
- stm32 ADC全解(单次,连续DMA传输)
- LayoutInflater的inflate方法引起的listview界面布局问题
- linux C 的文件编程
- OC-布局Layout、CoreAnimation层面的动画-CALayer&CAAnimation