原题链接

题意
选出三个数,要求两两互质或是两两不互质。求有多少组这样的三个数。

分析

同色三角形
n个点 每两个点连一条边(可以为红色或者黑色),求形成的三条边颜色相同的三角形的个数
反面考虑这个问题,只需要c(n,3)减去不同色的三角形个数即可
对于每一个点,所形成的不同色三角形即为 红色边的数量*黑色边的数量,所以可以O(n)地算出不同色三角形的个数(注意总数要除以2)
然后用c(n,3)减一下即可

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

那如何求 互质的个数和不互质的个数呢?
[可以参考一下这里]利用容斥原理求出每个数的不互质个数m,那么互质个数则为n-m-1。最终答案则为C(n,3)-m*(n-m+1)/2.
预处理每个数的质因子,计算出每种质因子搭配的个数(表明n个数中有多少个为其倍数)num[].

其他看代码:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<vector>
using namespace std;
#define eps 1e-12
#define inff 0x3fffffff
#define nn 110000
typedef __int64 LL;
int n;
int a[nn];
int num[nn];
vector<int>p[nn];
bool use[nn];
void init()
{
memset(use,false,sizeof(use));
for(int i=;i<=;i++)//分解质因子
{
if(!use[i])
{
for(int j=i;j<=;j+=i)
{
p[j].push_back(i);
use[j]=true;
}
}
}
}
int main()
{
int t,i,j,k;
init();
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=;i<=n;i++)
{
scanf("%d",&a[i]);
}
memset(num,,sizeof(num));
int lv;
int ix;
for(i=;i<=n;i++)//状压
{
if(a[i]==)
continue;
lv=p[a[i]].size();
for(j=;j<(<<lv);j++)
{
ix=;
for(k=;k<lv;k++)
{
if(((<<k)&j))
{
ix*=p[a[i]][k];
}
}
num[ix]++;//表示n个数中为ix的倍数的个数
}
}
int fc;
LL tem;
LL ans=;
LL m=n;
for(i=;i<=n;i++)
{
if(a[i]==)
continue;
lv=p[a[i]].size();
tem=;
for(j=;j<(<<lv);j++)
{
ix=;
fc=;
for(k=;k<lv;k++)
{
if(((<<k)&j))
{
ix*=p[a[i]][k];
fc++;
}
}
if(fc&)
{
tem+=num[ix];
}
else
tem-=num[ix];
}
//tem-1才是与其不互质的个数,意思为减去自身
ans+=(tem-)*(m-tem);
}
ans/=;
ans=m*(m-)*(m-)/-ans;
printf("%I64d\n",ans);
}
return ;
}

Hdu 5072 Coprime(容斥+同色三角形)的更多相关文章

  1. hdu 5072 Coprime (容斥)

    Problem Description There are n people standing in a line. Each of them has a unique id number. Now ...

  2. HDU - 4135 Co-prime 容斥定理

    题意:给定区间和n,求区间中与n互素的数的个数, . 思路:利用容斥定理求得先求得区间与n互素的数的个数,设表示区间中与n互素的数的个数, 那么区间中与n互素的数的个数等于.详细分析见求指定区间内与n ...

  3. HDU 4135 Co-prime (容斥+分解质因子)

    <题目链接> 题目大意: 给定区间[A,B](1 <= A <= B <= 10 15)和N(1 <=N <= 10 9),求出该区间中与N互质的数的个数. ...

  4. hdu 4135 Co-prime(容斥)

    Co-prime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  5. hdu 5514 Frogs(容斥)

    Frogs Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  6. HDU 5213 分块 容斥

    给出n个数,给出m个询问,询问 区间[l,r] [u,v],在两个区间内分别取一个数,两个的和为k的对数数量. $k<=2*N$,$n <= 30000$ 发现可以容斥简化一个询问.一个询 ...

  7. HDU 2588 思维 容斥

    求满足$1<=X<=N ,(X,N)>=M$的个数,其中$N, M (2<=N<=1000000000, 1<=M<=N)$. 首先,假定$(x, n)=m$ ...

  8. hdu 5072 Coprime(同色三角形+容斥)

    pid=5072">http://acm.hdu.edu.cn/showproblem.php?pid=5072 单色三角形模型 现场赛和队友想了3个小时,最后发现想跑偏了.感觉好可惜 ...

  9. HDU 5072 Coprime 同色三角形问题

    好吧,我承认就算当时再给我五个小时我也做不出来. 首先解释同色三角形问题: 给出n(n >= 3)个点,这些点中的一些被涂上了红色,剩下的被涂上了黑色.然后将这些点两两相连.于是每三个点都会组成 ...

随机推荐

  1. TimeLine CSS/Javascript 时间线

    https://casbootadminserver.herokuapp.com/#/applications/23bd8218/trace

  2. java程序在windows系统作为服务程序运行

    Java程序很多情况下是作为服务程序运行的,在Un*x 平台下可以利用在命令后加“&”把程序作为后台服务运行,但在Windows下看作那个Console窗口在桌面上,你是否一直担心别的同时把你 ...

  3. js對象

    js聲明一個數據,即使沒有賦值,也是創建了一個對象: js的所有數據都是對象,對象裡面有屬性也有方法,屬性方法是對象中的成員: 訪問對象的屬性:objectname.屬性名 訪問對象的方法:objec ...

  4. selenium之截图

    selenium支持对当前页面保存截图,使用方法: driver.get_screenshot_as_file(file_path) 代码举例: ...... def get_screenshot(d ...

  5. P2464 [SDOI2008]郁闷的小J

    题目描述 小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的危险,这也正是他所郁闷的. 具体说 ...

  6. Arif in Dhaka (First Love Part 2) UVA - 10294(Polya定理)

    这题和POJ-1286一样 题意: 给出t种颜色的n颗珠子 (每种颜色的珠子个数无限制,但总数必须是n), 求能制作出项链和手镯的个数 注意手镯可以翻转和旋转  而 项练只能旋转 解析: 注意Poly ...

  7. RedIsGood TopCoder - 9915(概率dp)

    ---恢复内容开始--- 论文题: 桌面上有 R 张红牌和 B 张黑牌,随机打乱顺序后放在桌面上,开始一张一张 地翻牌,翻到红牌得到 1 美元,黑牌则付出 1 美元.可以随时停止翻牌,在最优策略下平均 ...

  8. HTM L百度地图API 自定义工具地图实例

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. 学习Spring Boot:(二十四)多数据源配置与使用

    前言 随着业务量增大,可能有些业务不是放在同一个数据库中,所以系统有需求使用多个数据库完成业务需求,我们需要配置多个数据源,从而进行操作不同数据库中数据. 正文 JdbcTemplate 多数据源 配 ...

  10. 冬令营前的一些计划&记录

    冬令营前的一些计划&记录 计划 yyb发现自己很多以前学过的东西完完全全不记得了,所以在接下来的时间里可能会留下多篇复习向的博客,当然也可能因为觉得没有必要复习而到处乱做题. 现在先大概归类一 ...