题意:给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(容斥原理)的更多相关文章

  1. HDU 4135 Co-prime(容斥原理)

    Co-prime 第一发容斥,感觉挺有意思的 →_→ [题目链接]Co-prime [题目类型]容斥 &题意: 求(a,b)区间内,与n互质的数的个数. \(a,b\leq 10^{15}\) ...

  2. hdu4135 Co-prime 容斥原理

    Given a number N, you are asked to count the number of integers between A and B inclusive which are ...

  3. hdu5072 Coprime (2014鞍山区域赛C题)(数论)

    http://acm.hdu.edu.cn/showproblem.php?pid=5072 题意:给出N个数,求有多少个三元组,满足三个数全部两两互质或全部两两不互质. 题解: http://dty ...

  4. hdu 5072 Coprime 容斥原理

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submissio ...

  5. HDU5072 容斥原理

    G - Coprime Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit ...

  6. 2014鞍山现场赛C题HDU5072(素筛+容斥原理)

    Coprime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total ...

  7. [容斥原理] hdu 4135 Co-prime

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4135 Co-prime Time Limit: 2000/1000 MS (Java/Others) ...

  8. HDU 3388 Coprime(容斥原理+二分)

    Coprime Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  9. HDU 5072 Coprime (单色三角形+容斥原理)

    题目链接:Coprime pid=5072"> 题面: Coprime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: ...

  10. HDU4135 Co-prime(容斥原理)

    题目求[A,B]区间内与N互质数的个数. 可以通过求出区间内与N互质数的个数的前缀和,即[1,X],来得出[A,B]. 那么现在问题是求出[1,X]区间内与N互质数的个数,考虑这个问题的逆问题:[1, ...

随机推荐

  1. [POJ1050]To the Max(最大子矩阵,DP)

    题目链接:http://poj.org/problem?id=1050 发现这个题没有写过题解,现在补上吧,思路挺经典的. 思路就是枚举所有的连续的连续的行,比如1 2 3 4 12 23 34 45 ...

  2. [51NOD1127]最短的包含字符串(尺取法)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1127 思路:尺取法,一开始我考虑更新右指针,直到遇到一个和l指 ...

  3. config windows virtual machine on mac

    1.download virtualbox  and related extension pack from http://www.oracle.com/technetwork/server-stor ...

  4. Android实现分享内容到微信朋友圈

    原文地址:http://yanwushu.sinaapp.com/android_wechat_share/ 由于需求,要实现在应用中实现分享文字+图片到微信朋友圈.在网上找了一些资料,总结如下: 思 ...

  5. As of ADT 14, resource fields cannot be used as switch cases

        在导入Android Sample的ApiDemos的时候,发现R.id.xx的文件不能够在 switch cases 中使用 在google查询了下,找到以下答案: As of ADT 14 ...

  6. 【笨嘴拙舌WINDOWS】实践检验之按键精灵【Delphi】

    通过记录键盘和鼠标位置和输入信息,然后模拟发送,就能够创建一个按键精灵! 主要代码如下: library KeyBoardHook; { Important note about DLL memory ...

  7. HDU 3032 (Nim博弈变形) Nim or not Nim?

    博弈的题目,打表找规律还是相当有用的一个技巧. 这个游戏在原始的Nim游戏基础上又新加了一个操作,就是游戏者可以将一堆分成两堆. 这个SG函数值是多少并不明显,还是用记忆化搜索的方式打个表,规律就相当 ...

  8. (转)beanUtil接口和类(有空的时候去看,到时候删除这个说明)

    Jakarta Commons项目提供了相当丰富的API,我们之前了解到的Commons Lang只是众多API的比较核心的一小部分而已.Commons下面还有相当数量的子项目,用于解决各种各样不同方 ...

  9. IOS中用UIFont返回字体的行高、动态改变tableView中Cell的高度

    一.动态改变Cell的高度 1.利用tableView代理方法的返回值决定每一行cell的高度 - (CGFloat)tableView:(UITableView *)tableView height ...

  10. Python内置数据类型之Tuple篇

    Tuple 是不可变的 list.一旦创建了一个 tuple,就不可以改变它.这个有点像C++中的const修饰的变量.下面这段话摘自Dive Into Python: Tuple 比 list 操作 ...