现场过的第四多的题。。当时没什么想法,回来学了下容斥,又听学长讲了一讲,终于把它过了

题目大意:
给定n个数,求全部互质或者全部不互质的三元组的个数

先说一下同色三角形模型

n个点 每两个点连一条边(可以为红色或者黑色),求形成的三条边颜色相同的三角形的个数

反面考虑这个问题,只需要c(n,3)减去不同色的三角形个数即可

对于每一个点,所形成的不同色三角形即为 红色边的数量*黑色边的数量,所以可以O(n)地算出不同色三角形的个数(注意总数要除以2)

然后用c(n,3)减一下即可

对于这个题,如果把互质看作红色边,不互质看作黑色边,就可以转化为同色三角形问题了

那如何求 互质的个数和不互质的个数呢

我们可以预处理范围内每个数的倍数的数量,然后对每个数分解质因子,最后容斥一下即可

代码:

#include <iostream>
#include <stdio.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<ctype.h>
using namespace std;
#define MAXN 1000
long long n;
int a[];
int prime[];
int num[];
int isnotprime[];
int num_prime=;
int fac[][];
int np[];
long long gcd(long long a,long long b)
{
return b?gcd(b,a%b):a;
}
long long lcm(long long a,long long b)
{
return a/gcd(a,b)*b;
}
void setprime()
{
for(int i = ; i < MAXN ; i ++)
{
if(!isnotprime[i])
prime[num_prime ++]=i;
for(int j=;j<num_prime&&i*prime[j]<MAXN;j++)
{
isnotprime[i * prime[j]] = ;
if(!(i%prime[j] ) )
break;
}
}
return ;
}
void setfac(int x,int pos)
{
np[pos]=;
for(int i=;i<num_prime;i++)
{
if(!(x%prime[i]))
{
fac[pos][np[pos]++]=prime[i];
}
while(!(x%prime[i]))
{
x/=prime[i];
}
}
if(x>)
{
fac[pos][np[pos]++]=x;
}
}
long long iae(int pos)
{
long long res=;
for(int i=;i<(<<np[pos]);i++)
{
long long mut=,tmp=;
for(int j=;j<np[pos];j++)
{
if(i&(<<j))
{
mut*=fac[pos][j];
tmp++;
}
}
if(tmp&)
{
res+=num[mut]-;
}
else
{
res-=num[mut]-;
}
}
return res;
}
void setnum()
{
for(int i=;i<=;i++)
{
for(int j=i+i;j<=;j+=i)
num[i]+=num[j];
}
}
int main()
{
#ifndef ONLINE_JUDGE
//freopen("in.txt","r",stdin);
#endif
int T;
setprime();
scanf("%d",&T);
while(T--)
{
memset(num,,sizeof(num));
scanf("%I64d",&n);
for(int i=;i<n;i++)
{
scanf("%d",a+i);
num[a[i]]++;
setfac(a[i],i);
}
setnum();
long long ans=;
for(int i=;i<n;i++)
{
int tmp=iae(i);
ans+=(n--tmp)*tmp;
}
ans=n*(n-)*(n-)/-ans/;
printf("%I64d\n",ans);
}
return ;
}

hdu5072(鞍山regional problem C):容斥,同色三角形模型的更多相关文章

  1. Hdu 5072 Coprime(容斥+同色三角形)

    原题链接 题意选出三个数,要求两两互质或是两两不互质.求有多少组这样的三个数. 分析 同色三角形n个点 每两个点连一条边(可以为红色或者黑色),求形成的三条边颜色相同的三角形的个数反面考虑这个问题,只 ...

  2. 2015 asia xian regional F Color (容斥 + 组合数学)

    2015 asia xian regional F Color (容斥 + 组合数学) 题目链接http://codeforces.com/gym/100548/attachments Descrip ...

  3. BZoj 2301 Problem b(容斥定理+莫比乌斯反演)

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MB Submit: 7732  Solved: 3750 [Submi ...

  4. 广东工业大学2016校赛决赛-网络赛 1174 Problem F 我是好人4 容斥

    Problem F: 我是好人4 Description 众所周知,我是好人!所以不会出太难的题,题意很简单 给你n个数,问你1000000000(含1e9)以内有多少个正整数不是这n个数任意一个的倍 ...

  5. BZOJ.2301.[HAOI2011]Problem B(莫比乌斯反演 容斥)

    [Update] 我好像现在都看不懂我当时在写什么了=-= \(Description\) 求\(\sum_{i=a}^b\sum_{j=c}^d[(i,j)=k]\) \(Solution\) 首先 ...

  6. hdu5072 容斥+枚举

    这题说的是给了 n 个数字 每个数值大于1 小于100000,n小于100000 ,找出满足下面要求的三人组有多少种 比如abc ( (ab)==(bc)==(ac) ==1 )||( (ab)!=1 ...

  7. BZOJ 2301 Problem b (莫比乌斯反演+容斥)

    这道题和 HDU-1695不同的是,a,c不一定是1了.还是莫比乌斯的套路,加上容斥求结果. 设\(F(n,m,k)\)为满足\(gcd(i,j)=k(1\leq i\leq n,1\leq j\le ...

  8. BZOJ2301:[HAOI2011]Problem b(莫比乌斯反演,容斥)

    Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数 ...

  9. 洛谷 P2522 [HAOI2011]Problem b (莫比乌斯反演+简单容斥)

    题目描述 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 输入输出格式 输入格式: 第一行一个整数 ...

随机推荐

  1. ORACLE_CLASS_ENDING

    [JSU]LJDragon's Oracle course notes In the first semester, junior year Oracle考前复习 试题结构分析: 1.选择题2x10, ...

  2. 《Effective C++ 》学习笔记——条款11

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  3. 戴明PDCA方法

    戴明PDCA方法:即Plan(计划).Do(执行).Check(检查)和Action(处理)的缩写. P(plan)计划: 包括方针和目标的确定以及活动计划的制定; D(do)执行: 执行就是具体运作 ...

  4. IOS成长之路-Nsstring中搜索方法rangeOfString

    NSString *str1 = @"can you \n speak English"; NSString *str = @"\n"; //在str1这个字符 ...

  5. VC++深入详解读书笔记-第六章菜单

    1.MFC都是采用大写字母来标识资源ID号. 2.程序中会用到多种资源,在为资源确定其ID号时,为了明确区分资源类型,一般都遵循这样一个原则:在“ID”字符串后加上一个标识资源类型的字母,例如,我们给 ...

  6. c# 基础复习1

    1. 类和对象 1.1 类和对象的概念 类:对象的类型,它不同于 int 等基本数据类型,因为类具有行为:也可以说是具有相 同特征和行为的一组对象的集合. 对象:对象是一个个你能看得见,摸得着的实体, ...

  7. CSS应用五

    1. 页面变灰 html {   filter: grayscale(100%);//IE浏览器   -webkit-filter: grayscale(100%);//谷歌浏览器   -moz-fi ...

  8. php json_decode 后,数字对象转换成了 科学计数法 的解决方案

    php json_decode 后,数字对象转换成了 科学计数法 $obj='{"order_id":213477815351175,"buyer":10000 ...

  9. ucos_ii 上锁函数OSSchedLock()函数透析

    因为任务调度时一般都是通过OSTIMEDLY()来实现.在这个函数中会对当前的任务执行挂起.同时查看任务调度表中是否有优先级合适的就绪任务.如果当前任务运行时调用OSSchedLock()给调度器上锁 ...

  10. oracle分配角色和表空间

    注意点: 1.如果在PL/SQL 等工具里打开的话,直接修改下面的代码中[斜体加粗部分]执行 2.确保路径存在,比如[D:\oracle\oradata\Oracle9i\]也就是你要保存文件的路径存 ...