zoukankan      html  css  js  c++  java
  • BZOJ3444 最后的晚餐【细节题+组合数学】*

    BZOJ3444 最后的晚餐


    Description

    【问题背景】
    高三的学长们就要离开学校,各奔东西了。某班n人在举行最后的离别晚餐时,饭店老板觉得十分纠结。因为有m名学生偷偷找他,要求和自己暗恋的同学坐在一起。
    【问题描述】
    饭店给这些同学提供了一个很长的桌子,除了两头的同学,每一个同学都与两个同学相邻(即坐成一排)。给出所有信息,满足所有人的要求,求安排的方案总数(这个数字可能很大,请输出方案总数取余989381的值,也可能为0)。

    Input

    输入有m+1行,第一行有两个用空格隔开的正整数n、m,如题所示。接下来的m行,每一行有两个用空格隔开的正整数,第i行为Ai和Bi,表示Ai的暗恋对象为Bi,保证Ai互不相等。

    Output

    输出只有一行,这一行只有一个数字,如题所示。

    Sample Input

    4 2
    1 2
    4 3

    Sample Output

    8
    【数据范围】
    100%的数据,0<n≤500000,1≤Ai,Bi≤n,0≤m≤n,保证没有人自恋。


    这题首先是我们把关系看成无相边
    这就来了一个问题,我们需要把重边去掉,可以用map搞一下
    然后就是如果一个点的度数大于二不合法
    其次是有大小大于2的环不合法
    剩下的方案数就是2大于等于2的联通块数量∗(总联通块数量)!2^{大于等于2的联通块数量}*(总联通块数量)!22()!


     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define N 500010
     4 #define Mod 989381
     5 #define fu(a,b,c) for(int a=b;a<=c;++a)
     6 struct Edge{int v,nxt;}E[N<<1];
     7 int head[N],tot=0;
     8 int n,m,d[N],bel[N],siz[N],mark[N];
     9 map<int,bool> g[N];
    10 void add(int u,int v){E[++tot]=(Edge){v,head[u]};head[u]=tot;}
    11 void dfs(int u,int fa,int belong){
    12   bel[u]=belong;
    13   siz[belong]++;
    14   for(int i=head[u];i;i=E[i].nxt){
    15     int v=E[i].v;
    16     if(v==fa)continue;
    17     if(bel[v])mark[belong]=1;
    18     else dfs(v,u,belong);
    19   }
    20 }
    21 int main(){
    22   scanf("%d%d",&n,&m);
    23   fu(i,1,m){
    24     int u,v;scanf("%d%d",&u,&v);
    25     if(u>v)swap(u,v);
    26     if(g[u][v])continue;
    27     g[u][v]=1;
    28     add(u,v);
    29     add(v,u);
    30     d[u]++;d[v]++;
    31   }
    32   fu(i,1,n)if(d[i]>2){printf("0");return 0;}
    33   int cnt=0;
    34   fu(i,1,n)if(!bel[i])dfs(i,0,++cnt);
    35   int ans=1;
    36   fu(i,1,cnt){
    37     if(mark[i]&&siz[i]>2){printf("0");return 0;}
    38     ans=1ll*ans*i%Mod;
    39     if(siz[i]>1)ans=2*ans%Mod;
    40   }
    41   printf("%d",ans);
    42   return 0;
    43 }
  • 相关阅读:
    全面解释java中StringBuilder、StringBuffer、String类之间的关系
    如何解决Java.lang.NoClassDefFoundError--第一部分
    Java中Vector和ArrayList的区别
    深入研究java.lang.ThreadLocal类
    Frame.pack()与frame.validate()方法的区别
    Oracle中start with...connect by子句的用法
    Java 的swing.GroupLayout布局管理器的使用方法和实例
    Java SE 6.0实现高质量桌面集成开发
    苹果App Store开发者帐户从申请,验证,到发布应用(2)
    苹果App Store开发者帐户从申请,验证,到发布应用(1)
  • 原文地址:https://www.cnblogs.com/dream-maker-yk/p/9676245.html
Copyright © 2011-2022 走看看