POJ 3904 (容斥定理)
来源:互联网 发布:淘宝客交易成功后退款 编辑:程序博客网 时间:2024/05/23 00:02
题意:
给出n个数,输出能由4个数组成的最小公约数是1的总个数。
思路:
很容易想到可以用总的组合数减去最小公约数不为一的数的个数。
但是该怎么求呢?
可以先求出每一个数能够被整除的因子,保存个数于count之中,那么剩下的就是
找出四个数因子不为1的组合个数。
比如:2的因子个数总和为a个,3有b个,6有c个。那么所求就是
ans = C(n,4) - { C(a,4) + C(b,4) - C(c,4) };
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int MAXN = 10005;int n,m;int count[MAXN];__int64 A[MAXN];int num[MAXN];int prim[MAXN];void init(){ memset(num,0,sizeof(num)); memset(A,0,sizeof(A)); for(__int64 i = 4;i < MAXN; i++) { A[i] = i*(i-1)*(i-2)*(i-3)/24; }}void solve(int n){ int pos = 0; for(int i = 2;i*i <= n; i++) { if(n%i == 0) { prim[pos++] = i; } while(n%i == 0) n /= i; } if(n != 1) prim[pos++] = n; for(int i = 1;i < (1 << pos); i++) { int sum = 0; int k = 1; for(int j = 0;j < pos; j++) { if(i & (1<<j)) { k *= prim[j]; sum ++; } } count[k]++; num[k] = sum; }}int main(){ //freopen("in.txt","r",stdin); init(); while(scanf("%d",&n) != EOF) { memset(count,0,sizeof(count)); for(int i = 0;i < n; i++) { scanf("%d",&m); solve(m); } __int64 ans = 0; for(int i = 0;i < MAXN; i++) { if(count[i]) { if(num[i]%2) { ans += A[count[i]]; } else ans -= A[count[i]]; } } printf("%I64d\n",A[n]-ans); } return 0;}
0 0
- POJ 3904 (容斥定理)
- POJ 2773 二分+容斥定理
- POJ 2773 Happy 2006 容斥定理+二分
- 数论 + 容斥定理
- HDU4407Sum 容斥定理
- uva11806(容斥定理)
- 容斥定理
- 容斥定理
- 容斥定理
- POJ_3904_Sky_Code 容斥定理
- HDU5514Frogs 【容斥定理】
- 容斥定理 | 初步
- UVA10325(容斥定理)
- poj 3904 容斥原理
- POJ 3904(容斥原理)
- POJ 3904 容斥原理
- Cheerleaders(容斥定理)
- poj3695&bzoj1853 容斥定理
- Qt之界面切换(360、新浪、人人界面,多语化切换随心所欲)
- 01 简介语法点
- ubnutu小知识
- 在Ubuntu下生成动态库与静态库
- (转)onNewIntent调用时机
- POJ 3904 (容斥定理)
- 【软件工具】(一)markdown如何打开和使用
- PAT_乙级_1003_筱筱
- 下沉的船
- crontab不执行扫盲贴(求置顶)
- 204. Count Primes
- Nutch2.3.1 hbase配置加使用。
- JAVA-堆内存、栈内存
- 新人入职环境配置