好吧,我承认就算当时再给我五个小时我也做不出来。

首先解释同色三角形问题:

给出n(n >= 3)个点,这些点中的一些被涂上了红色,剩下的被涂上了黑色。然后将这些点两两相连。于是每三个点都会组成一个三角形,

即总共同拥有sum = C(3,n)个三角形。

对于一个三角形,假设三个点颜色一样则称其为同色三角形。

那么一个非常直观的思路就是容斥,sum - 非同色三角形个数ans。

ans = (sigma (Xi*Yi) ) / 2;(1 <= i <= n,Xi,Yi分别表示与第 i 个点相连的红色点和黑色点的个数。

)

状态不好的时候,代码写的就像屎一样。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <cmath>
#include <stack>
#include <map> #pragma comment(linker, "/STACK:1024000000")
#define EPS (1e-8)
#define LL long long
#define ULL unsigned long long
#define INF 0x3f3f3f3f using namespace std; int divi[100010][130]; bool is[100010]; int num[100010]; int mem[100010]; int ch[1001]; int Check(int x)
{
int ans = 0;
while(x)
ans += (x&1),x >>= 1;
return ans&1 ? 1:-1;
} int main()
{
int n = 100000,i,j,k; for(i = 0;i <= 1000; ++i)
ch[i] = Check(i); for(i = 1;i <= n; ++i)
divi[i][0] = 0; memset(is,false,sizeof(is)); for(i = 2;i <= n; ++i)
{
if(is[i] == false)
{
divi[i][++divi[i][0]] = i; for(j = i+i;j <= n; j += i)
{
divi[j][++divi[j][0]] = i;
is[j] = true;
}
}
} int Max,Mul,t;
int wf;
for(i = 1;i <= n; ++i)
{
Max = (1<<divi[i][0]) - 1;
wf = divi[i][0];
for(j = 1;j <= Max; ++j)
{
for(Mul = 1,t = 1,k = wf;k >= 1; --k,t <<= 1)
{
if((j&t) && j != t)
Mul *= divi[i][k];
}
if(Mul != 1)
divi[i][++divi[i][0]] = Mul*ch[j];
}
} int T,tmp;
LL ans,sum; int Top; scanf("%d",&T); while(T--)
{
scanf("%d",&n); memset(is,false,sizeof(is)); for(i = 1,Top = 0;i <= n; ++i)
{
scanf("%d",&num[i]);
is[num[i]] = true;
Top = max(Top,num[i]);
} ans = 0; memset(mem,-1,sizeof(mem));
LL anw = 0;
for(i = 1;i <= n; ++i)
{
tmp = num[i];
ans = 0;
for(j = divi[tmp][0];j >= 1; --j)
{
if(mem[abs(divi[tmp][j])] != -1)
sum = mem[abs(divi[tmp][j])]*(divi[tmp][j]/abs(divi[tmp][j]));
else
{
sum = 0;
for(k = abs(divi[tmp][j]);k <= Top; k += abs(divi[tmp][j]))
sum += is[k] ? 1 : 0;
mem[abs(divi[tmp][j])] = sum;
sum *= (divi[tmp][j]/abs(divi[tmp][j]));
}
ans += sum;
}
if(ans)
anw += (n-ans)*(ans-1);
}
LL tn = n;
printf("%I64d\n",tn*(tn-1)*(tn-2)/6 -anw/2);
} return 0;
}

HDU 5072 Coprime 同色三角形问题的更多相关文章

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

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

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

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

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

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

  4. hdu 5072 Coprime

    http://acm.hdu.edu.cn/showproblem.php?pid=5072 题意:给出 n 个互不相同的数,求满足以下条件的三元无序组的个数:要么两两互质要么两两不互质. 思路:根据 ...

  5. hdu 5072 Coprime 容斥原理

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

  6. hdu 5072 Coprime (容斥)

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

  7. ACM学习历程—HDU 5072 Coprime(容斥原理)

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

  8. hdu5072(鞍山regional problem C):容斥,同色三角形模型

    现场过的第四多的题..当时没什么想法,回来学了下容斥,又听学长讲了一讲,终于把它过了 题目大意:给定n个数,求全部互质或者全部不互质的三元组的个数 先说一下同色三角形模型 n个点 每两个点连一条边(可 ...

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

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

随机推荐

  1. Python 极简教程(一)前言

    现在 Python 用处很多,学的人也很多,其流行程度自不必说.但是很多人学 Python 的时候都遇到过问题,特别对于非计算机专业毕业的人来说. 现在的教程非常多,但是绝大部分对于初学者都不够友好. ...

  2. SQL分页的几种方式

    1.使用Row_number() over(order by columnName)函数来作为标示分页(下面的例子都是以last_seen来排序的,要求取顺序为20-30行的数据) SELECT Us ...

  3. STM32W108无线射频模块串行通信接口编程实例

    STM32W108无线射频模块UART通信应用实例 基于STM32W108芯片,编写串口測试程序,測试串口通信.完毕PC通过串口与STM32W108进行通信. 开发环境与硬件平台 硬件:STM32W1 ...

  4. ASP.NET路径解惑

    对于ASP.NET的路径问题,一直都是云里雾里,没有去详细的理解,今天正好可以梳理一下它们之间的关系和使用方法.而若想明白路径的表示方式的使用方法和区别以及注意事项可以通过下面的几个概念来进一步加深: ...

  5. js原生代码实现鼠标拖拽(超简单)

    首先先来看这一张图 在这种图中,盒子的大小为512px,并且margin-left:-250px margin-top:140px;并通过一些样式让其在中部显示 这些样式都不是重要的,这里加个marg ...

  6. spring与cxf整合配置webservice接口(以jaxws:server的方式配置)

    ps:最近项目需要跟其他系统做同步,需要使用webservice来提供接口给其他系统调用:临时抱佛脚赶紧去网上找了下资料,发现用Endpoint的方式发布接口好容易哦:赶紧写了个例子做验证,发布成功. ...

  7. 使用jmeter监控服务器性能指标

    先下载jmeter-ServerAgent Windows下载和Linux下载 https://jmeter-plugins.org/wiki/PerfMon/  找到ServerAgent的下载链接 ...

  8. 学习 Perl(一) —— 安装及 hello world

    所谓存在的即是合理的,尤其适用于琳琅满目的编程语言界.每种编程语言在设计之初均只为解决特定领域的特定问题而生,没有语言擅长所有的领域能够完美地解决所有的问题. 这里推荐一本经典的 perl 入门书:P ...

  9. ACdream 1127 Base Station (离线查询+树状数组)

    题目链接: http://acdream.info/problem?pid=1127 题目: 移动通信系统中,通信网的建立主要通过基站来完成. 基站可以分为主基站和子基站.子基站和各个移动用户进行连接 ...

  10. ZOJ 1586 QS Network MST prim水题

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=586 题目大意: QS是一种生物,要完成通信,需要设备,每个QS需要的设备的价格 ...