hdu 5072 Coprime(同色三角形+容斥)
pid=5072">http://acm.hdu.edu.cn/showproblem.php?pid=5072
现场赛和队友想了3个小时,最后发现想跑偏了。感觉好可惜的一道题,要是知道这个模型....就能够轻松的拿银了啊。
。
。
题意不再赘述,就是求同色三角形的个数。总的三角形的个数是C(n,3),仅仅需减去不同色的三角形就可以。对于每一个点(数),与它互质的连红边,不互质的连蓝边,那么对于该点不同色三角形个数为蓝边数*红边数/2,由于同一个三角形被计算了两次。
那么同色三角形个数为C(n,3) - ∑蓝边数*红边数/2。
我们仅仅需求出蓝边数就能得知红边数。怎么求与该数不互质的数的个数?首先对原来的数质因子分解,把这些质因子的全部组合枚举出来,每一个质因子最多使用一次,得到若干个质因子的组合为ansNum,使用容斥原理,观察ansNum的质因子的个数。若是奇数就加上全部能被ansNum整数的数的个数。否则就减去。这样求出蓝边数。红边数也就已知了。
#include <stdio.h>
#include <iostream>
#include <map>
#include <set>
#include <bitset>
#include <list>
#include <stack>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#include <algorithm>
#define LL __int64
//#define LL long long
#define eps 1e-9
#define PI acos(-1.0)
using namespace std;
const LL INF = 1<<30;
const int maxn = 100010; int test;
LL n;
int a[maxn],num[maxn];
int prime[maxn];
bool flag[maxn];
int fact[maxn][20];
int coun[maxn]; void getPrime()
{
memset(flag,0,sizeof(flag));
flag[1] = true;
prime[0] = 0;
for(int i = 2; i < maxn; i++)
{
if(flag[i] == false)
prime[++prime[0]] = i;
for(int j = 1; j <= prime[0]&&i*prime[j] < maxn; j++)
{
flag[prime[j]*i] = true;
if(i%prime[j] == 0)
break;
}
}
} void getFact(int dig, int pos)
{
int tmp = dig; for(int i = 1; i <= prime[0] && prime[i]*prime[i] <= tmp; i++)
{
if(tmp % prime[i] == 0)
{
fact[pos][coun[pos]++] = prime[i];
while(tmp % prime[i] == 0)
tmp /= prime[i];
}
if(tmp == 1)
break;
}
if(tmp > 1)
fact[pos][coun[pos]++] = tmp;
} void init()
{
for(int i = 2; i <= 100000; i++)
{
for(int j = i+i; j <= 100000; j += i)
num[i] += num[j];
}
} int main()
{
getPrime();
scanf("%d",&test);
while(test--)
{
memset(num,0,sizeof(num));
scanf("%I64d",&n);
for(int i = 1; i <= n; i++)
{
scanf("%d",&a[i]);
num[a[i]]++;
} init();
memset(coun,0,sizeof(coun)); LL ans = 0; for(int i = 1; i <= n; i++)
{
LL res = 0;
getFact(a[i], i);
for(int j = 1; j < (1<<coun[i]); j++)
{
LL ansNum = 1;
int cnt = 0;
for(int k = 0; k < coun[i]; k++)
{
if(j & (1<<k) )
{
ansNum *= fact[i][k];
cnt++;
}
}
if(cnt & 1)
res += (num[ansNum]-1);
else
res -= (num[ansNum]-1);
}
ans += (n-1-res)*res;
}
ans = n*(n-1)*(n-2)/6 - ans/2; //注意n为LL
printf("%I64d\n",ans);
}
return 0;
}
hdu 5072 Coprime(同色三角形+容斥)的更多相关文章
- HDU 5072 Coprime 同色三角形问题
好吧,我承认就算当时再给我五个小时我也做不出来. 首先解释同色三角形问题: 给出n(n >= 3)个点,这些点中的一些被涂上了红色,剩下的被涂上了黑色.然后将这些点两两相连.于是每三个点都会组成 ...
- HDU 4135 Co-prime 欧拉+容斥定理
Co-prime Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- 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 5768 Lucky7 (中国剩余定理+容斥)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5768 给你n个同余方程组,然后给你l,r,问你l,r中有多少数%7=0且%ai != bi. 比较明显 ...
- bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形 容斥
1914: [Usaco2010 OPen]Triangle Counting 数三角形 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 272 Sol ...
- hdu 6390 欧拉函数+容斥(莫比乌斯函数) GuGuFishtion
http://acm.hdu.edu.cn/showproblem.php?pid=6390 题意:求一个式子 题解:看题解,写代码 第一行就看不出来,后面的sigma公式也不会化简.mobius也不 ...
随机推荐
- Qt数据类型转换
把QString转换为double类型 方法1.QString str="123.45"; double val=str.toDouble(); //val=123.45 方法2. ...
- Ubuntu下用NdisWrapper安装网卡驱动
下面是一个简单全面的使用NdisWrapper的指南.这是从Beginning Ubuntu Linux, Second Edition中提炼出来的. 这份指南是第8章的一部分.该章给出了在Ubunt ...
- LAMP一键安装包(Python版)
去年有出一个python整的LAMP自动安装,不过比较傻,直接调用的yum 去安装了XXX...不过这次一样有用shell..我也想如何不调用shell 来弄一个LAMP自动安装部署啥啥的..不过尼玛 ...
- 使用Spring的@Autowired 实现DAO, Service, Controller三层的注入(转)
简述: 结合Spring和Hibernate进行开发 使用@Autowired实现依赖注入, 实现一个学生注册的功能,做一个技术原型 从DAO(Repository) -> Service -& ...
- HDOJ 4687 Boke and Tsukkomi 一般图最大匹配带花树+暴力
一般图最大匹配带花树+暴力: 先算最大匹配 C1 在枚举每一条边,去掉和这条边两个端点有关的边.....再跑Edmonds得到匹配C2 假设C2+2==C1则这条边再某个最大匹配中 Boke and ...
- 探索Android该Parcel机制(上)
一.先从Serialize说起 我们都知道JAVA中的Serialize机制,译成串行化.序列化……,其作用是能将数据对象存入字节流其中,在须要时又一次生成对象. 主要应用是利用外部存储设备保存对象状 ...
- 三白话经典算法系列 Shell排序实现
山是包插入的精髓排序排序,这种方法,也被称为窄增量排序.因为DL.Shell至1959提出命名. 该方法的基本思想是:先将整个待排元素序列切割成若干个子序列(由相隔某个"增量"的元 ...
- 重新想象 Windows 8 Store Apps (21) - 动画: ThemeTransition(过渡效果)
原文:重新想象 Windows 8 Store Apps (21) - 动画: ThemeTransition(过渡效果) [源码下载] 重新想象 Windows 8 Store Apps (21) ...
- BZOJ 2007 NOI2010 海拔高度 最小减产计划
标题效果:YT城市是一个精心规划的城市.这个城市是东西向和南北向干道成n×n地区性.简单.可以YT作为一个城市广场,每个区域也可被视为一个正方形.因此,.YT市中含有(n+1)×(n+1)交叉口和2n ...
- Maven学习笔记(十一年):柔性结构
一个典型的项目将是开发环境.测试环境和生产环境,这些环境的数据库配置是不一样的,并使用正确的配置. Maven为了支持构建的灵活性,内置了三大特性,即属性.Profile和资源过滤.本章将介绍这些特性 ...