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

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

给出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. Large Division (大数求余)

    Given two integers, a and b, you should check whether a is divisible by b or not. We know that an in ...

  2. SJTU 3001. 二哥的幸运

    Description 二哥是一个挺二的人,在二哥的世界观中,有些数字代表着幸运,假设在某一天二哥可以看到一个幸运数字,那么他将很高兴.当然,二哥对于幸运的定义也是不同凡响,假设一个数字仅仅包括4或者 ...

  3. amazeui学习笔记一(开始使用3)--兼容性列表compatibility

    amazeui学习笔记一(开始使用3)--兼容性列表compatibility 一.总结 1.不要用ie做前端测试,不要碰ie,尽量用google 浏览器: 按照微软官方的说法,IE 开发者工具中的浏 ...

  4. 1.11 Python基础知识 - 序列:元组

    元组(tuple)是一组有序系列,元组和列表是否相似,但是元组是不可变的对象,不能修改.添加或删除元组中的元素,但可以访问元组中的元素 元组的定义: 元组采用圆括号中用逗号分隔的元素 元组的基本操作和 ...

  5. v-for实现循环嵌套

    <!DOCTYPE html> <html lang="en"> <head> <title></title> < ...

  6. (转)oracle 启动监听 报“监听程序不支持服务” 解决

    转自 http://www.51testing.com/html/99/478599-842622.html 今天安装了oracle后,启动监听,报错如下:    启动tnslsnr: 请稍候... ...

  7. Python数据结构同Json类型数据相互转换的用法

    在做Python接口自动化的时候,经常要用到Python数据结构同Json类型数据相互转换来供我们做进一步的验证提供数据,在此做个记录和总结 Python数据结构同Json类型数据相互转换的函数有:j ...

  8. 彩票案例-frame,center和bounds属性

    控件的属性: 二.frame.center和bounds属性 " 在iOS中,每一个控件都是继承于UIView的.都会有视图的属性存在,控制这个视图的位置就有Frame和Bounds两个属性 ...

  9. amazeui学习笔记--css(布局相关1)--网格Grid

    amazeui学习笔记--css(布局相关1)--网格Grid 一.总结 基本使用 1.div+class布局:amaze里面采取的就是div+class的布局方式  <div class=&q ...

  10. Altium Designer中距离的测量

    Ctrl+M 清除测量标签:点击右下角的清除按键