HDU 5072 Coprime 同色三角形问题
好吧,我承认就算当时再给我五个小时我也做不出来。
首先解释同色三角形问题:
给出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 同色三角形问题的更多相关文章
- hdu 5072 Coprime(同色三角形+容斥)
pid=5072">http://acm.hdu.edu.cn/showproblem.php?pid=5072 单色三角形模型 现场赛和队友想了3个小时,最后发现想跑偏了.感觉好可惜 ...
- HDU 5072 Coprime (单色三角形+容斥原理)
题目链接:Coprime pid=5072"> 题面: Coprime Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- Hdu 5072 Coprime(容斥+同色三角形)
原题链接 题意选出三个数,要求两两互质或是两两不互质.求有多少组这样的三个数. 分析 同色三角形n个点 每两个点连一条边(可以为红色或者黑色),求形成的三条边颜色相同的三角形的个数反面考虑这个问题,只 ...
- hdu 5072 Coprime
http://acm.hdu.edu.cn/showproblem.php?pid=5072 题意:给出 n 个互不相同的数,求满足以下条件的三元无序组的个数:要么两两互质要么两两不互质. 思路:根据 ...
- hdu 5072 Coprime 容斥原理
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submissio ...
- hdu 5072 Coprime (容斥)
Problem Description There are n people standing in a line. Each of them has a unique id number. Now ...
- ACM学习历程—HDU 5072 Coprime(容斥原理)
Description There are n people standing in a line. Each of them has a unique id number. Now the Ragn ...
- hdu5072(鞍山regional problem C):容斥,同色三角形模型
现场过的第四多的题..当时没什么想法,回来学了下容斥,又听学长讲了一讲,终于把它过了 题目大意:给定n个数,求全部互质或者全部不互质的三元组的个数 先说一下同色三角形模型 n个点 每两个点连一条边(可 ...
- [容斥原理] hdu 4135 Co-prime
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4135 Co-prime Time Limit: 2000/1000 MS (Java/Others) ...
随机推荐
- ACM 中JAVA的应用
原文地址:http://www.cppblog.com/vontroy/archive/2010/05/24/116233.html 先说一下Java对于ACM的一些优点吧: (1) 对于熟悉C/C+ ...
- color-在framwork中添加属性变量
1.今天在修改framwork中的代码的时候,需要把自己在代码中写的一个#ffffff,变成在xml中引用的变量.具体操作方法如下 1)在 frameworks/base/core/res/res/v ...
- R语言-方差分析
方差分析指的是不同变量之间互相影响从而导致结果的变化 1.单因素方差分析: 案例:50名患者接受降低胆固醇治疗的药物,其中三种治疗条件使用药物相同(20mg一天一次,10mg一天两次,5mg一天四次) ...
- rhel5安装 oracle10
readhat 安装11gr2文档 需要注意的地方:必须关掉的 1,防火墙:2,SElinux . root 用户运行 setup 命令可关防火墙与SElinux 修改网络配置文件,一定要重启此文 ...
- subline Text3 安装及汉化
因为自己的subline 有问题 所以决心重新改一下了. 三步: http://www.sublimetext.com/3 官网下载subline3 https://www.imjeff. ...
- VUE笔记 - 列表过渡动画 v-enter, v-leave-to | v-enter-active, v-leave-active | v-move
本例要结合过渡动画四个过程的示意图一起理解. https://cn.vuejs.org/v2/guide/transitions.html 疑问: v-for="(item,i) in li ...
- 1.3 Python基础知识 - 用户交互及传递参数
一.用户交互 用户交互方面,每种开发语言都有不同的方式,例如shell语言用的是,“read -p "What is your name ? " ”.python中是什么样子的呢 ...
- 微信支付v2开发(1) 微信支付URL配置
本文介绍微信支付申请时如何设置授权目录及URL. 在申请微信支付时,第一项就会碰到下图的配置. 下面就对这一设置进行讲解! 一.选择支付类型 目前有两种支付类型 JS API网页支付 Native原生 ...
- 对生产者和消费者问题的另一个解决办法是使用QWaitCondition(封装好了wakeOne,wakeAll,而且与QReadWriteLock对接,几乎是万能的办法)
对生产者和消费者问题的另一个解决办法是使用QWaitCondition,它允许线程在一定条件下唤醒其他线程.其中wakeOne()函数在条件满足时随机唤醒一个等待线程,而wakeAll()函数则在条件 ...
- Log4net.confager配置官方文档
http://logging.apache.org/log4net/release/config-examples.html