zoukankan      html  css  js  c++  java
  • 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
    ",++cas,ans);
    93     }
    94 
    95     return 0;
    96 }

     

  • 相关阅读:
    Java开发环境安装,环境变量
    Java开发环境
    命令提示符
    字节
    进制之间的转换
    Java背景
    项目中如何实现分页
    集合实战
    程序优化--降低复杂度
    消息队列 ---常用的 MQ 中间件
  • 原文地址:https://www.cnblogs.com/shimu/p/5953198.html
Copyright © 2011-2022 走看看