ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

HZNU Training 22 for Zhejiang Provincial Competition 2020

2020-04-15 19:58:34  阅读:233  来源: 互联网

标签:Provincial Training const 22 int ll typedef long define


F - Instability

题意:一张图,求有多少个集合,包含三元环或者补三元环,

考虑 如下性质

 

Ramsey定理--世界上任意6个人中,总有3个人相互认识,或互相皆不认识。

 当集合大小大于6时,发生了变化,一定满足,至少三个互不相连,或者互相连接,

记录一下6元以上的关系,算出组合数,然后暴力出 n = 5,n=4,n = 3的情况。

#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long long ll;
typedef unsigned long long ull;
#define pb push_back
#define fi first
#define se second
const int maxn=100;
const int N=70;
const int inf=0x3f3f3f3f;
int gp[N][N];
const ll MOD=1e9+7;
long long C[200][200];
int n,m;
void get_C(){
    C[0][0] = 1;
    for(int i=1;i<=maxn;i++)
    {
        C[i][0] = 1;
        for(int j=1;j<=i;j++)
            // C[i][j] = C[i-1][j]+C[i-1][j-1];
            C[i][j] = (C[i-1][j]+C[i-1][j-1])%MOD;
    }
}
void init(){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            gp[i][j]=0;
        }
    }
}
bool ok(int a,int b,int c){
    if(gp[a][b]&&gp[a][c]&&gp[b][c])return 1;
    else if(!gp[a][b]&&!gp[a][c]&&!gp[b][c])return 1;
    return 0;
}
bool ok(int a,int b,int c,int d){
    if(ok(a,b,c))return 1;
    if(ok(a,b,d))return 1;
    if(ok(b,c,d))return 1;
    if(ok(a,c,d))return 1;
    return 0;
}
bool ok(int a,int b,int c,int d,int e){
    if(ok(b,c,d,e))return 1;
    if(ok(a,d,c,e))return 1;
    if(ok(a,b,d,e))return 1;
    if(ok(a,b,c,e))return 1;
    if(ok(a,b,c,d))return 1;
    return 0;
}
int main(){
    get_C();
    int t,kase=0;
    scanf("%d",&t);
    while(t--){
    scanf("%d %d",&n,&m);
        init();
    for(int i=1,u,v;i<=m;i++){
        scanf("%d %d",&u,&v);
        gp[u][v]=gp[v][u]=1;
    }
    ll cnt=0;
    if(n>=6){
    for(int i=6;i<=n;i++)cnt=(cnt+C[n][i])%MOD;
    }

    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))cnt++;
            }
        }
    }

    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 l=k+1;l<=n;l++){
                if(ok(i,j,k,l))cnt++;
                }
            }
        }
    }
    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 l=k+1;l<=n;l++){
                    for(int p=l+1;p<=n;p++){
                    if(ok(i,j,k,l,p))cnt++;
                    }
                }
            }
        }
    }

    cnt%=MOD;
    printf("Case #%d: %lld\n",++kase,cnt);
    }
    // system("pause");
    return 0;
}
// 除非枚举每一个集合,但这样复杂度O(n!)
View Code

G - Sequence I

暴力枚举即可

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int a[N],b[N];
int main(){
    int t;
    scanf("%d",&t);
    int kase=0;
    while(t--){
        int n,m,p;
        scanf("%d %d %d",&n,&m,&p);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        for(int i=1;i<=m;i++)scanf("%d",&b[i]);
        int ans=0;
        for(int i=1;i+(m-1)*p<=n;i++){
            bool flag=1;
            for(int j=i;j<=i+(m-1)*p;j+=p){
                if(a[j]!=b[(j-i)/p+1]){flag=0;break;}
            }
            if(flag)ans++;
        }
        printf("Case #%d: %d\n",++kase,ans);
    }
    system("pause");
    return 0;
}
// E和I应该都是数论
// F:一张图n个点,求1到n不稳定子集个数,一个集合不稳定当且仅当他有一个子集,互不相连,或者两两相连
View Code

 

标签:Provincial,Training,const,22,int,ll,typedef,long,define
来源: https://www.cnblogs.com/littlerita/p/12707546.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有