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 namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;
const int maxn = 50 + 20;
int e[maxn][maxn];
const LL MOD = 1e9 + 7;
void add(LL &x, LL y) {
    x = (x + MOD + y) % MOD;
}
bool ok(int i, int j, int k) {
    return ((e[i][j] && e[j][k] && e[k][i]) || (!e[i][j] && !e[j][k] && !e[k][i]));
}
LL po[maxn];
int f;
void work() {
    memset(e, false, sizeof e);
    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= m; ++i) {
        int u, v;
        scanf("%d%d", &u, &v);
        e[u][v] = e[v][u] = 1;
    }
    LL ans = po[n];
    add(ans, -(n + 1));
    add(ans, -(n * (n - 1) / 2));
    LL t = 0;
    for (int i = 1; i <= n; ++i) {
        for (int j = i + 1; j <= n; ++j) {
            for (int k = j + 1; k <= n; ++k) {
                if (!ok(i, j, k)) t++;
            }
        }
    }
    for (int i = 1; i <= n; ++i) {
        for (int j = i + 1; j <= n; ++j) {
            for (int k = j + 1; k <= n; ++k) {
                for (int h = k + 1; h <= n; ++h) {
                    if (!ok(i, j, k) && !ok(i, j, h) && !ok(i, k, h) && !ok(j, k, h)) t++;
                }
            }
        }
    }
    for (int i = 1; i <= n; ++i) {
        for (int j = i + 1; j <= n; ++j) {
            for (int k = j + 1; k <= n; ++k) {
                for (int h = k + 1; h <= n; ++h) {
                    for (int ha = h + 1; ha <= n; ++ha) {
                        if (!ok(i, j, k) && !ok(i, j, h) && !ok(i, k, h) && !ok(j, k, h) && !ok(i, j, ha) &&
                          !ok(i, k, ha) && !ok(i, h, ha) && !ok(j, k, ha) && !ok(j, h, ha) &&
                          !ok(k, h, ha)) t++;
                    }
                }
            }
        }
    }
    t %= MOD;
    add(ans, -t);
    printf("Case #%d: %lld\n", ++f, ans);
}

int main() {
#ifdef local
    freopen("data.txt", "r", stdin);
//    freopen("data.txt", "w", stdout);
#endif
    po[0] = 1;
    for (int i = 1; i <= maxn - 2; ++i) {
        po[i] = 2 * po[i - 1] % MOD;
    }
    int t;
    scanf("%d", &t);
    while (t--) work();
    return 0;
}

时间: 2024-12-09 23:04:53

HDU 5917 Instability ramsey定理的相关文章

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 #incl

hdu 5917

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

HDU 5768 中国剩余定理

题目链接:Lucky7 题意:求在l和r范围内,满足能被7整除,而且不满足任意一组,x mod p[i] = a[i]的数的个数. 思路:容斥定理+中国剩余定理+快速乘法. (奇+ 偶-) #include <stdio.h> #include <string.h> #include <iostream> using namespace std; #define LL long long #define FOR(i, n) for (int i=0; i<n; +

HDU 6158 笛卡尔定理+韦达定理

The Designer Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 761    Accepted Submission(s): 142 Problem Description Nowadays, little haha got a problem from his teacher.His teacher wants to desi

hdu 3944 DP? (Lucas 定理)

仔细观察杨辉三角后可以发现从最高点到第n行第k个数的最短路为c(n+1,k); 根据Lucas定理可以求出,一般来说要求答案模去一个质数p且p的范围不大于10^5则可用Lucas. Lucas(n,m,p)=cm(n%p,m%p)* Lucas(n/p,m/p,p) Lucas(x,0,p)=1; 另外注意当k>n/2时,必须令k=n-k. #include <iostream> #include <cstdio> #include <cstring> #incl

hdu 5690(同余定理找循环节 / 快速幂)

1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 #define lld I64d 5 #ifdef _WIN32 6 #define LLD "%I64d" 7 #else 8 #define LLD "%lld" 9 #endif 10 const int N = 10000 + 100; 11 ll x,m,c,k; 12 int pos[N]; 1

hdu 3037Saving Beans(卢卡斯定理)

Saving Beans Saving Beans Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5761    Accepted Submission(s): 2310 Problem Description Although winter is far away, squirrels have to work day and nig

hdu 1573 同余定理

#include <cstdio> #include <iostream> #include <algorithm> using namespace std; long long n,m; long long int a[100]; long long int b[100]; int gcd(int a,int b){ return b == 0? a: gcd(b,a%b); } int main(){ int t; scanf("%d",&

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