题意:给你一个无向图,问图中有多少个符合条件的集合?条件为这个集合里面存在一个子集(大小>=3)为团或者都是孤立点。答案mod1e9+7;

根据 Ramsey定理,大于等于6个的集合,肯定存在一个子集的边都是红色或者都是蓝色,即为团还是为孤立点;

所以当n大于等于6的时候,所有的取6个或六个以上的子集的集合都是符合的,所以将这些排列组合的方式全部都计算在内;

即C(n,i)  i的取值范围为(6~n) 但是这样子算会超时,我们可以计算C(n,i) i从0开始计算,这样子所有的数加起来,就是2^n

然后再减去C(n,i)i从0到5即可;

n的取值范围到50,所以暴力不超时;

然后还剩下点集为3到5的情况,这个时候,我们就分别枚举点集为3,4,5,判断是否满足情况即可(题目给出的m条边就在这个时候起作用)

只要满足图中有3个为孤立点即可;

代码如下:

 #include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int M = 1e2+;
const LL mod = 1e9+;
int ncase,n,m,cas=;
int vis[M][M];
LL fac[M];
void init()
{ ///预处理阶乘
fac[]=;fac[]=;
for (int i=;i<M;i++)
fac[i]=fac[i-]*i%mod;
}
LL quick_pow(LL p,LL k) ///快速幂
{
LL res=,tp=p;
if(k<) return ;
while(k){
if(k&) res=res*tp%mod;
tp=tp*tp%mod;
k>>=;
}
return res;
}
LL C(int n,int m)
{
return fac[n]*quick_pow(fac[m],mod-)%mod*quick_pow(fac[n-m],mod-)%mod;
}///费马小定理求逆元+快速幂
int judge(int i,int j,int k){ ///判断三点之间满不满足不稳定点集
if(vis[i][j]&&vis[i][k]&&vis[j][k]) return ;///三点之间相连
if(!vis[i][j]&&!vis[i][k]&&!vis[j][k]) return ; ///三点之间不互联
return ;
}
int judge1(int i,int j,int k,int l)
{
if(judge(i,j,k)||judge(i,j,l)||judge(j,k,l)||judge(i,k,l)) return ; ///表示4个点中有三个点为不稳定点集就行,为什么呢?
///因为时题目要求的,不稳定点集为3个点。
return ;
}
int judge2(int i,int j,int k,int l,int o){
///表示5个点中有4个点满足就行
if(judge1(i,j,k,l)||judge1(i,j,k,o)||judge1(i,j,l,o)||judge1(j,k,l,o)||judge1(i,k,l,o)) return ;
return ;
} int main(){ init();
scanf("%d",&ncase);
while(ncase--){
scanf("%d%d",&n,&m);
memset(vis,false,sizeof(vis));
for(int i=;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
vis[u][v]=vis[v][u]=;
}
LL ans=;
if(n>=){
ans=(ans+quick_pow(,n))%mod; ///多项式定理C(n,0)+C(n,1)+...+C(n,n)=2^n
///C(n,k)(k>=6)表示,从n个中取k个出来,总存在一个不稳定点集的个数(三点之间互联或三点之间不连)
for(int i=;i<;i++) ///减去前5个
ans=(ans-C(n,i)+mod)%mod;
}
if(n>=){ ///暴力取3个
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
for(int k=j+;k<=n;k++)
if(judge(i,j,k)) ans=(ans+)%mod;
}
if(n>=){ ///暴力取4个
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
for(int k=j+;k<=n;k++)
for(int l=k+;l<=n;l++)
if(judge1(i,j,k,l)) ans=(ans+)%mod;
}
if(n>=){ ///暴力取5个
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
for(int k=j+;k<=n;k++)
for(int l=k+;l<=n;l++)
for(int o=l+;o<=n;o++)
if(judge2(i,j,k,l,o)) ans=(ans+)%mod;
}
printf("Case #%d: %lld\n",cas++,ans);
}
return ;}

hdu 5917的更多相关文章

  1. HDU 5917 Instability ramsey定理

    http://acm.hdu.edu.cn/showproblem.php?pid=5917 即世界上任意6个人中,总有3个人相互认识,或互相皆不认识. 所以子集 >= 6的一定是合法的. 然后 ...

  2. HDU - 5917 水题

    题意:n个点m条边,找点集个数,点集满足有任意三个点成环,或者三个点互不相连 题解:暴力复杂度O(n^5/120*O(ok))==O(能过) //#pragma comment(linker, &qu ...

  3. 近几年ACM/ICPC区域赛铜牌题

    2013 changsha zoj 3726 3728 3736 3735 2013 chengdu hud 4786 4788 4790 2013 hangzhou hdu 4770 4771 47 ...

  4. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  5. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  6. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

  7. HDU 4569 Special equations(取模)

    Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  8. HDU 4006The kth great number(K大数 +小顶堆)

    The kth great number Time Limit:1000MS     Memory Limit:65768KB     64bit IO Format:%I64d & %I64 ...

  9. HDU 1796How many integers can you find(容斥原理)

    How many integers can you find Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%I64d ...

随机推荐

  1. h5 中修改input中 placeholder的颜色

    input::-webkit-input-placeholder{ color:blue; } input::-moz-placeholder{ /* Mozilla Firefox 19+ */ c ...

  2. LeetCode 面试题22. 链表中倒数第k个节点

    题目链接:https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/ 输入一个链表,输出该链表中倒数第 ...

  3. Python 编程入门(4):变量与赋值

    以下所有例子都基于最新版本的 Python,为了便于消化,每一篇都尽量短小精悍,希望你能尽力去掌握 Python 编程的「概念」,可以的话去动手试一下这些例子(就算目前还没完全搞懂),加深理解. 经过 ...

  4. 面试想拿 10K,HR 说你只值 7K,该怎样回答或者反驳?

    当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫. 礼貌地说:"7K是吗?了解了.嗯~其实我对贵司的面试官印象很好.只不过,现在我的手头上已经有一份11K的offer. ...

  5. 有多少人在面试时,被Java 如何线程间通讯,问哭了?

    正常情况下,每个子线程完成各自的任务就可以结束了.不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了. 本文涉及到的知识点: thread.join(), object. ...

  6. python 字典 day6

    字典 :键与值用:分开   项与项用,分开 特点:key-value结构‘ key为不可变数据类型,key必须唯一 可以任意存放多个value值 ,可以不唯一,可修改 无序 查询速度极快  且不受di ...

  7. python常见函数积累

    shape() 返回数组或者数据框有多少行或者多少列 import numpy as np x = np.array([[1,2,5],[2,3,5],[3,4,5],[2,3,6]]) #输出数组的 ...

  8. Sentence by defender

    也许,人在旅途,不是你看清了多少事,而是你看轻了多少事.

  9. 前端页面中:jsp和HTML的区别之处

    JSP和HTML的区别 HTML页面是静态页面,也就是事先由用户写好放在服务器上,固定内容,不会变,由web服务器向客户端发送,平时上网看的网页都是大部分都是基于html语言的. JSP页面是有JSP ...

  10. 【android】Parcelable的相关技术总结

    关于Parcelable的相关知识学习   进行Android开发的时候,无法将对象的引用传给Activities或者Fragments,我们需要将这些对象放到一个Intent或者Bundle里面,然 ...