题意:给出n(n<10000)个数,这些数<=10000,要求选出四个数字且他们的最大公约数为1的(注意:不需要两两互质),有多少种选法。

分析:

容斥原理

假设平面上有一些圆,互相之间有重叠部分,我们要求这些圆覆盖的总面积(重叠部分只记一次)。计算方法就是:加上所有被覆盖了至少1次的面积加,减去所有被覆盖了至少2次的面积,加上所有被覆盖了至少3次的面积……对于奇数的就加,对于偶数的就减,最终结果即为覆盖的总面积。把这些圆变成是集合的话,那么这个计算过程就是容斥原理。

本题可以先计算n个数字选四个总共有多少种选法,然后减去公约数不是1的。把共同具有某一素因子的数字划分到同一个集合,属于统一集合的四个数最大公约数一定大于1,如果四个数字不同时属于任何集合则最大公约数一定为1。用总的组合数减去那些四个数字同时被同一个集合包括了的组合数,所得结果即为最终答案。但是这些一个四个数字的组合可能同时属于若干个集合,因此需要在这些集合之间进行容斥原理,以求每个需要被减去的四个数字的组合都恰好被减掉一次。

有一个统计数组,统计每个部分(集合或者集合的交集)中包含多少个数字(实际应该统计四个数字组合数,但是由于组合数可以通过数字数求得,在此为了方便只统计数字数)。实际操作时可以对每个数字分解质因数,把这些质因数在统计数组中的对应位加1。同时也要计算那些集合的重叠部分,也就是同时包含若干个质因子的情况,所以把每个数字质因子的所有组合方式相乘得到的数在统计数组中的对应位加1。还要记录它包含了几个质因子(是几个集合相交的交集)。以便以后容斥原理观察奇偶性时使用。

现在我们知道了所有部分包含的数字数量,但是计算的时候注意,我们求的不是数字数量,而是四个数字组合的数量。所以容斥原理加减过程加减的是四个数字的组合数。

#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std; #define MAX_N 100005
#define MAX_FACTOR 16 int n, f[MAX_N];
int count[MAX_N];
int factor[MAX_FACTOR];
int prime_fac_num[MAX_N]; void input()
{
for (int i = ; i < n; i++)
scanf("%d", &f[i]);
} void make(int a)
{
int factor_cnt = ;
for (int i = ; i * i <= a; i++)
if (a % i == )
{
factor[factor_cnt++] = i;
while (a % i == )
a /= i;
}
if (a > )
factor[factor_cnt++] = a;
for (int i = ; i < ( << factor_cnt); i++)
{
int used_fac = ;
int cur_fac = ;
for (int j = ; (i >> j) > ; j++)
{
if ((i >> j) & )
{
used_fac++;
cur_fac *= factor[j];
}
}
count[cur_fac]++;
prime_fac_num[cur_fac] = used_fac;
} } long long cal(long long a)
{
return a * (a - ) * (a - ) * (a - ) / ;
} int main()
{
while (scanf("%d", &n) != EOF)
{
input();
memset(count, , sizeof(count));
memset(prime_fac_num, , sizeof(prime_fac_num));
for (int i = ; i < n; i++)
make(f[i]);
long long ans = cal(n);
for (int i = ; i <= ; i++)
{
if (prime_fac_num[i] & )
ans -= cal(count[i]);
else
ans += cal(count[i]);
}
printf("%lld\n", ans);
}
return ;
}

poj3904的更多相关文章

  1. [poj3904]Sky Code_状态压缩_容斥原理

    Sky Code poj-3904 题目大意:给你n个数,问能选出多少满足题意的组数. 注释:如果一个组数满足题意当且仅当这个组中有且只有4个数,且这4个数的最大公约数是1,$1\le n\le 10 ...

  2. 【POJ3904】【P1202】水晶密码

    说是莫比乌斯反演,其实只是玩儿玩儿内个miu函数而已…… 原题: wty  打算攻击 applepi  的用来存放机密数据的水晶系统. applepi 早有察觉,于是布置了一个密码系统来防备 wty ...

  3. POJ3904 Sky Code

    题意 Language:Default Sky Code Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3980 Accepte ...

  4. poj3904 Sky Code —— 唯一分解定理 + 容斥原理 + 组合

    题目链接:http://poj.org/problem?id=3904 Sky Code Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  5. POJ3904 Sky Code【容斥原理】

    题目链接: http://poj.org/problem?id=3904 题目大意: 给你N个整数.从这N个数中选择4个数,使得这四个数的公约数为1.求满足条件的 四元组个数. 解题思路: 四个数的公 ...

  6. Sky Code(poj3904)

    Sky Code Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2085   Accepted: 665 Descripti ...

  7. poj 3904(莫比乌斯反演)

    POJ 3904 题意: 从n个数中选择4个数使他们的GCD = 1,求总共有多少种方法 Sample Input 4 2 3 4 5 4 2 4 6 8 7 2 3 4 5 7 6 8 Sample ...

  8. ACM学习大纲

    1 推荐题库 •http://ace.delos.com/usaco/ 美国的OI 题库,如果是刚入门的新手,可以尝试先把它刷通,能够学到几乎全部的基础算法极其优化,全部的题解及标程还有题目翻译可以b ...

  9. ACM训练大纲

    1. 算法总结及推荐题目 1.1 C++ STL • STL容器: set, map, vector, priority_queue, queue, stack, deque, bitset• STL ...

随机推荐

  1. Google-解决在调试页面或者js时总是提示烦恼的断点问题

    按F12键,然后切换到Source标签,看底下的那个跟暂停一样的图标是不是变成蓝色或紫色了? 如果是蓝色或者紫色,则把他切换到“灰色”状态(点击图标就会切换成不同的状态.或者可能是其他颜色状态),如下 ...

  2. 高斯混合聚类及EM实现

    一.引言 我们谈到了用 k-means 进行聚类的方法,这次我们来说一下另一个很流行的算法:Gaussian Mixture Model (GMM).事实上,GMM 和 k-means 很像,不过 G ...

  3. POJ1364 King

    Description Once, in one kingdom, there was a queen and that queen was expecting a baby. The queen p ...

  4. PL/0编译器(java version)–PL0.java

    1: package compiler; 2:   3: import java.io.BufferedWriter; 4: import java.io.FileWriter; 5:   6: /* ...

  5. 架构(Architecture)和框架(Framework)杂谈

    1. 架构和框架的设计层次不同       类似于硬件设计,软件设计也分为不同的层次.典型的软件设计层次如下图:        在这个图中我们可以看到,Framework处于Micro-archite ...

  6. linux在线学习

    https://www.shiyanlou.com/courses/running/291#note

  7. ci中如何私有化方法

    私有方法 在某些情况下,你可能想要隐藏一些方法使之无法对外查阅.将方法私有化很简单,只要在方法名字前面加一个下划线("_")做前缀就无法通过 URL 访问到了.例如,如果你有一个像 ...

  8. Machine Learning Methods: Decision trees and forests

    Machine Learning Methods: Decision trees and forests This post contains our crib notes on the basics ...

  9. hdu 1284 钱币兑换问题(动态规划)

    Ac code : 完全背包: #include<stdio.h> #include<string.h> int dp[4][40000]; int main(void) { ...

  10. Java NIO原理和使用

    Java NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内 ...