HDU5917 RAMSEY定理

 1 参考自:http://blog.csdn.net/Miracle_ma/article/details/52737597?locationNum=1
 2 给你n个点,m条边,然后告诉你选择一个点集S
 3 如果里面有一个子集A,A里面的点都不相连,或者都相连,则这个点集不稳定
 4 求不稳定的个数
 5 子集A的大小是大于等于3,所以考虑到6个点的图,里面肯定有3个点,互相有边,或者互相没边
 6 所以用ramsey定理优化,6以上都可以直接求
 7 剩下3,4,5的情况,搜索或者循环
 8 #include <iostream>
 9 #include <algorithm>
10 #include <cstdio>
11 #include <cmath>
12 #include <memory.h>
13 #include <queue>
14 #include <map>
15 #include <set>
16 using namespace std;
17 typedef long long ll;
18 const int maxn = 1e5 + 10;
19 const int mod = 1e9 + 7;
20 int n,m,mp[60][60];
21 ll fact[60];
22 int ok3(int a,int b,int c){
23     if(mp[a][b] == 0&&mp[a][c] == 0&&mp[b][c] == 0) return 1;
24     if(mp[a][b] == 1&&mp[a][c] == 1&&mp[b][c] == 1) return 1;
25     return 0;
26 }
27 int ok4(int a,int b,int c,int d){
28     if(ok3(a,b,c)||ok3(a,b,d)||ok3(a,c,d)||ok3(b,c,d)) return 1;
29     else return 0;
30 }
31 int ok5(int a,int b,int c,int d,int e){
32     if(ok4(a,b,c,d)||ok4(a,b,c,e)||ok4(a,b,d,e)||ok4(a,c,d,e)||ok4(b,c,d,e)) return 1;
33     else return 0;
34 }
35 void init(){
36     fact[0]=1;
37     for(int i=1;i<=50;i++) fact[i]=fact[i-1]*i%mod;
38 }
39 ll qpow(ll a,ll n){
40     ll ans=1;
41     while(n){
42         if(n&1) ans=ans*a%mod;
43         a=a*a%mod;
44         n>>=1;
45     }
46     return ans;
47 }
48
49 ll C(int n,int m){
50     return fact[n]*qpow(fact[m],mod-2)%mod*qpow(fact[n-m],mod-2)%mod;
51 }
52
53 int main() {
54    // freopen("in.txt","r",stdin);
55     //freopen("out.txt","w",stdout);
56     int T;
57     init();
58     int cas = 0;
59     cin>>T;
60     while(T--){
61         scanf("%d%d",&n,&m);
62         memset(mp,0,sizeof(mp));
63         int x,y;
64         for(int i = 1;i <= m;i++){
65             scanf("%d%d",&x,&y);
66             mp[x][y] = 1;
67             mp[y][x] = 1;
68         }
69         ll ans = 0;
70         for(int i = 1;i <= n;i++)
71             for(int j = i + 1;j <= n;j++)
72                 for(int k = j + 1;k <= n;k++)
73                     if(ok3(i,j,k)) ans++;
74         for(int i = 1;i <= n;i++)
75             for(int j = i + 1;j <= n;j++)
76                 for(int k = j + 1;k <= n;k++)
77                     for(int l = k + 1;l <= n;l++)
78                         if(ok4(i,j,k,l)) ans++;
79         for(int i = 1;i <= n;i++)
80             for(int j = i + 1;j <= n;j++)
81                 for(int k = j + 1;k <= n;k++)
82                     for(int l = k + 1;l <= n;l++)
83                         for(int m = l + 1;m <= n;m++)
84                             if(ok5(i,j,k,l,m)) ans++;
85         ans %= mod;
86          if(n>=6){
87             for(int i=6;i<=n;i++){
88                 ans+=C(n,i);
89                 if(ans>=mod) ans-=mod;
90             }
91         }
92         printf("Case #%d: %lld\n",++cas,ans);
93     }
94
95     return 0;
96 }
时间: 2024-08-05 13:14:25

HDU5917 RAMSEY定理的相关文章

HDU 5917 Instability ramsey定理

http://acm.hdu.edu.cn/showproblem.php?pid=5917 即世界上任意6个人中,总有3个人相互认识,或互相皆不认识. 所以子集 >= 6的一定是合法的. 然后总的子集数目是2^n,减去不合法的,暴力枚举即可. 选了1个肯定不合法,2个也是,3个的话C(n, 3)枚举判断,C(n, 4), C(n, 5) #include <bits/stdc++.h> #define IOS ios::sync_with_stdio(false) using name

[2016CCPC]长春现场赛重现

1002.公式,手算一下就能找到两个式子的关系,迭代一下就行. 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn = 9; 5 int a[maxn], b[maxn]; 6 int n, p, q; 7 8 int gcd(int x, int y) { 9 return y == 0 ? x : gcd(y, x%y); 10 } 11 12 int main() { 13 //freopen(&quo

CCPC 2017 网络赛

1001.我们的想法是,先构造n个要删掉的点,然后不断给图加边,使得每条边的其中一个点在n个点之中. 我们要使n个点之外的点尽量多,并且每次删掉的点在n个点之外. 贪心的决策是,每次操作,前n个点的度和令外的最大度的点度数相同. 然后删掉这个点之后,之后的操作,剩余的点也满足这个要求.所以度数最大的点必定与n个点有边. 于是可以这样构造,增加n批点(i = 1~n),每次增加n/i个点的,每个增加的点连出i条边到n个点. 这样,n个点每次增加的最大度数不超过1.但每次删点的时候(按n~1批的顺序

hdu 6152 : Friend-Graph (2017 CCPC网络赛 1003)

题目链接 裸的结论题.百度 Ramsey定理.刚学过之后以为在哪也不会用到23333333333,没想到今天网络赛居然出了.顺利在题面更改前A掉~~~(我觉得要不是我开机慢+编译慢+中间暂时死机,我还能再早几分钟过掉它 #include<bits/stdc++.h> using namespace std; int g[8][8]; int n; void solve() { for(int i=1; i<=n; i++) for(int j=i+1; j<=n; j++) for

ACM知识点总结

1 枚举 2 模拟 3 构造 4 位运算的应用 5 查找 5.1 二分查找 5.2 分块查找 5.3 哈希查找HASH 5.3.1 线性探测法 5.3.2 字符串与哈希 6 搜索 6.1 深度优先搜索DFS 6.1.1 剪枝 6.1.2 人工栈DFS 6.2 宽度优先搜索BFS 6.3 启发式搜索 7 贪心法 7.1 哈夫曼树 8 高精度 8.1 大数加减法 8.2 大数乘法 8.3 大数除法与取余 9 排序问题 9.1 冒泡排序 9.2 选择排序 9.3 插入排序 9.4 快速排序 9.5 归

OI Trainning 知识体系结构

OI Trainning 知识体系结构 From:http://www.cnblogs.com/hadilo/p/5840434.html 初级 1.1 C语言基础 1.1.1 C语言程序结构(A+B Problem) 1.1.2 变量,常量,数据类型,输入与输出 1.1.3 条件语句 1.1.4 循环语句 1.1.5 数组 1.1.6 字符数组.字符串 1.1.7 指针 1.1.8 共同体.结构体 1.1.9 函数 1.1.10 过关练习题 中级 2.1 深度优先搜索 2.1.1 栈与递归函数

浅谈鸽巢原理的证明和简单应用

一.鸽巢原理的证明 1.定义: 若有n个鸽巢和kn+1只鸽子,所有的鸽子都进入鸽巢,那么至少有一个巢中有k+1只鸽子(n,k≥0). 2.证明(反证法): 若每个鸽巢中的鸽子数都不大于k,则总鸽子数<=kn,与已知相悖.得证. 3.拉姆齐(Ramsey)定理的证明:6个人中,要么存在三个人彼此互相认识,要么存在三个人彼此都不认识: 证明:设六个人为六个点,认识或不认识用两种不同颜色的线段代表,因为两人只有一种关系,所以任意一点一定会引出连向其他5点的五个线段,根据鸽巢定理,有2种关系,有2*2+

第五关——数论:组合数学

20:44:00 你在台上唱着我的创作,布局谋篇像本悲情小说——许嵩<最佳歌手> 我的寒假,我美好的寒假啊啊啊 “其实我还蛮不想写你的,博客,可是没办法啊,谁叫我的寒假不要我了,我就只好要你了,博客” 目录 鸽巢原理 鸽巢原理推广 杨辉三角和二项式系数 容斥定理 卡特兰数 斯特林数 那接下来就要来看一下鸽巢原理(抽屉原理)啦 也不知道发现它的人是不是看着别人鸽子的窝盯半天才发现的,人家鸽子会不好意思的啦! 定义:如果有n+1个鸽子要进n个鸽巢,则至少存在一个鸽巢种包含两个或更多的鸽子. 例题:

hdu 5917

题意:给你一个无向图,问图中有多少个符合条件的集合?条件为这个集合里面存在一个子集(大小>=3)为团或者都是孤立点.答案mod1e9+7: 根据 Ramsey定理,大于等于6个的集合,肯定存在一个子集的边都是红色或者都是蓝色,即为团还是为孤立点: 所以当n大于等于6的时候,所有的取6个或六个以上的子集的集合都是符合的,所以将这些排列组合的方式全部都计算在内: 即C(n,i)  i的取值范围为(6~n) 但是这样子算会超时,我们可以计算C(n,i) i从0开始计算,这样子所有的数加起来,就是2^n