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) ...
随机推荐
- MFC中对话框的各种消息触发时间
小结:WM_CREATE是所有窗口都能响应的消息,表明本窗口已经创建完毕.可以安全的使用这个窗口了,例如在它上面画控件等等.这个状态肯定是在调用ShowWindows()显示窗口之前.WM_WM_IN ...
- HDU 4607 Park Visit HDU暑期多校1
10W个点的一棵树,边权为1 求访问K个点要走过的最小路程 BFS求出一条最长路以后,我们可以YY出其他的边都要重复走两次 树上的最长路可以从任意一点开始BFS求出这点的最大距离,再把终点设置为起点再 ...
- vue移动端上拉加载更多
LoadMore.vue <template> <div class="load-more-wrapper" @touchstart="touchSta ...
- wmi 一些配置(参考)
http://www.bubuko.com/infodetail-1937463.html
- 洛谷 P1207 [USACO1.2]双重回文数 Dual Palindromes
P1207 [USACO1.2]双重回文数 Dual Palindromes 题目描述 如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做“回文数”.例如,12321就是一个回文数,而7777 ...
- POJ 1012:Joseph
Joseph Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 50068 Accepted: 19020 Descript ...
- 16、cgminer学习之:popen函数和system函数详解(执行系统命令)
1.popen函数我们先用man指令查一下popen函数: 函数说明: (1)popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令. (2) ...
- COGS——C66. [HAOI2004模拟] 数列问题
http://www.cogs.pro/cogs/problem/problem.php?pid=66 ★☆ 输入文件:dfs3.in 输出文件:dfs3.out 简单对比 时间限制:1 ...
- winedt (latex 编译器)解决中文的问题(CJK & CTEX)
主要是导入相关的库支持: 1. CJK \usepackage{CJK}:CJK,是中日韩的英文首字母的组合,处理中文需要先导入这个包: \begin{CJK*}{GBK}{song}:默认句式,表示 ...
- 微信支付v2开发(3) JS API支付
本文介绍如何使用JS API支付接口完成微信支付. 一.JS API支付接口(getBrandWCPayRequest) 微信JS API只能在微信内置浏览器中使用,其他浏览器调用无效.微信提供get ...