hdu5072-Coprime(容斥原理)
题意:给N个互不相同的数,选择出两两互质或者两两不互质的三个数,有多少种选法。
题解:一共有C(N,3)中选择方式,减去不符合要求的,剩下的就是答案。
详见 http://blog.csdn.net/csuhoward/article/details/44978087
看到有的题解说是同色三角形,感觉和CCPC长春那个六个人三个人必有互相认识或者互相不认识好像= =
开始求出了所有质数的组合,然后一直T,后来看题解发现只要对现有的数做预处理就可以=。=
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath> using namespace std;
typedef long long ll; const int N = ;
int a[N], n;
int fac[N][], sz[N];
int ret[N];
int vis[N]; int prime[N], p;
bool is_prime[N]; int sieve()
{
for (int i = ; i < N; ++i) is_prime[i] = true;
is_prime[] = is_prime[] = false;
for (int i = ; i < N; ++i) {
if (is_prime[i]) {
prime[p++] = i;
for (int j = * i; j <= n; j += i)
is_prime[j] = false;
}
}
return p;
} void init() {
int cnt, x, limit;
for (int i = ; i <= ; ++i) {
x = i, limit = sqrt(x), cnt = ;
for (int k = ; prime[k] <= limit; ++k) {
if (x % prime[k] == ) fac[i][cnt++] = prime[k];
while (x % prime[k] == ) x /= prime[k];
}
if (x > ) fac[i][cnt++] = x;
sz[i] = cnt;
}
} ll solve() {
memset(ret, , sizeof ret);
for (int i = ; i < N; ++i) {
for (int j = i; j < N; j += i) {
if (vis[j]) ret[i]++;
}
} ll ans = ;
for (int i = ; i < n; ++i) {
int cnt = sz[a[i]];
int st = <<cnt;
ll tmp = ;
for (int k = ; k < st; ++k) {
int val = ;
int w = ;
for (int j = ; j < cnt; ++j) {
if (k & (<<j)) {
val *= fac[a[i]][j];
w ^= ;
}
}
if (w) tmp += ret[val]-;
else tmp -= ret[val]-;
}
ans += tmp * (n-tmp-);
}
return ans;
} int main()
{
int T;
scanf("%d", &T);
sieve();
init();
while (T--) {
scanf("%d", &n);
memset(vis, , sizeof vis); // everyone has unique id
for (int i = ; i < n; ++i) scanf("%d", &a[i]), vis[a[i]] = ;
ll ans = solve();
ll tot = (ll)n * (n-) * (n-) / ;
printf("%lld\n", tot - ans/);
}
return ;
}
hdu5072-Coprime(容斥原理)的更多相关文章
- HDU 4135 Co-prime(容斥原理)
Co-prime 第一发容斥,感觉挺有意思的 →_→ [题目链接]Co-prime [题目类型]容斥 &题意: 求(a,b)区间内,与n互质的数的个数. \(a,b\leq 10^{15}\) ...
- hdu4135 Co-prime 容斥原理
Given a number N, you are asked to count the number of integers between A and B inclusive which are ...
- hdu5072 Coprime (2014鞍山区域赛C题)(数论)
http://acm.hdu.edu.cn/showproblem.php?pid=5072 题意:给出N个数,求有多少个三元组,满足三个数全部两两互质或全部两两不互质. 题解: http://dty ...
- hdu 5072 Coprime 容斥原理
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submissio ...
- HDU5072 容斥原理
G - Coprime Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit ...
- 2014鞍山现场赛C题HDU5072(素筛+容斥原理)
Coprime Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total ...
- [容斥原理] hdu 4135 Co-prime
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4135 Co-prime Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 3388 Coprime(容斥原理+二分)
Coprime Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- HDU 5072 Coprime (单色三角形+容斥原理)
题目链接:Coprime pid=5072"> 题面: Coprime Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- HDU4135 Co-prime(容斥原理)
题目求[A,B]区间内与N互质数的个数. 可以通过求出区间内与N互质数的个数的前缀和,即[1,X],来得出[A,B]. 那么现在问题是求出[1,X]区间内与N互质数的个数,考虑这个问题的逆问题:[1, ...
随机推荐
- C盘空间不足
C盘空间不足 2014-11-27 Win7实用技巧之七实战C盘空间不足之三招四式
- An AnnotationConfiguration instance is required to use
An AnnotationConfiguration instance is required to use <mapping class="jebe7282/study/hibern ...
- ArrayList集合的语句示例
namespace ArrayList集合的语句示例{ class Program { static void Main(string[] args) { ...
- 在页面中使用js
JavaScript:用来在页面编写特效的,和HTML\CSS一样当都是由浏览器解析 JavaScript语言 一.JS如何运行(JavaScript,jscript,VbScript,applet ...
- HDU 1599 find the mincost route (无向图的最小环)
题意: 给一个带权无向图,求其至少有3个点组成的环的最小权之和. 思路: (1)DFS可以做,实现了确实可以,只是TLE了.量少的时候应该还是可以水一下的.主要思路就是,深搜过程如果当前点搜到一个点访 ...
- 【原创】牛顿法和拟牛顿法 -- BFGS, L-BFGS, OWL-QN
数据.特征和数值优化算法是机器学习的核心,而牛顿法及其改良(拟牛顿法)是机器最常用的一类数字优化算法,今天就从牛顿法开始,介绍几个拟牛顿法算法.本博文只介绍算法的思想,具体的数学推导过程不做介绍. 1 ...
- 【转】 IOS 项目配置--构建输出DIR
原文网址:http://blog.csdn.net/fengsh998/article/details/8868871 通常在情一般都不建议使用绝对路径,因为写死之后,换环境,换平台,又要重新修改路径 ...
- Shell教程4-Shell替换
如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. 举个例子: 复制纯文本新窗口 #!/bin/bash a=10 echo -e & ...
- Arduino命令行编译 树莓派连接Arduino 电脑上编译Arduino代码后 通过树莓派烧写到Arduino上
//本教程针对UNO 1.在file->preferences中找到preferences.txt文件 2:用记事本打开preferences.txt,选择hex文件存放的路径,在最后行加入 b ...
- Excel 绘制图表,如何显示横轴的数据范围
右键点击X坐标轴,然后选中“设置图表区域格式”,然后在“坐标轴选项”--“区域”处设置X轴范围. 备注,这种方式仅使用与第一列时日期时间类型的数据. 应用场景 当,选择有两列数据,第一列为横轴数据,第 ...