bzoj3659Which Dreamed It

Posted chitongz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj3659Which Dreamed It相关的知识,希望对你有一定的参考价值。

Solution

\(BEST\) 定理,套用完成后,由于每一个路径都对应了 \(deg_1\) 这么多的不同起始方向的情况数,乘上去就可以了。

Code

#include<bits/stdc++.h>

using namespace std;

inline void read (int&a)

    a = 0; char k = getchar(); int f = 1;
    while (k > '9' || k < '0')  if (k == '0') f = -1; k = getchar(); 
    while (k >= '0' && k <= '9')  a = a * 10 + k - '0'; k = getchar (); 
    a *= f;


const int N = 200 + 5, mod = 1000003;
inline int plu (int u, int v)  return u + v >= mod ? u + v - mod : u + v; 
inline int sub (int u, int v)  return u - v < 0 ? u - v + mod : u - v; 
inline int mul (int u, int v)  return 1LL * u * v % mod; 
int a[N][N], n, outdeg[N], indeg[N], fac[200000 + 5];

inline int Guass ()

//  for (int i = 1; i <= n; ++i, puts (""))
//      for (int j = 1; j <= n; ++j)
//          printf ("%d ", a[i][j]);
    int ans = 1;
    for (int i = 1; i <= n - 1; ++i)
    
        for (int j = i + 1; j <= n - 1; ++j)
        
            while (a[j][i])
            
                int l = a[i][i] / a[j][i];
                for (int k = i; k <= n - 1; ++k)
                    a[i][k] = sub (a[i][k], mul (l, a[j][k]));
                swap (a[i], a[j]);
                ans = mod - ans;
            
        
        ans = mul (ans, a[i][i]);
    
    return ans;


int main ()

    fac[0] = 1;
    for (int i = 1; i <= 200000; ++i)
        fac[i] = 1LL * fac[i - 1] * i % mod;
    while (scanf ("%d", &n) == 1 && n)
    
        memset (a, 0, sizeof a);
        memset (outdeg, 0, sizeof outdeg);
        memset (indeg, 0, sizeof indeg);
        for (int i = 1; i <= n; ++i)
        
            int s; read (s);
            for (int j = 1; j <= s; ++j)
            
                int k; read (k);//i -> k
                a[i][k]--;
                a[i][i]++;
                indeg[k]++;
                outdeg[i]++;
            
        
        if (n == 1)  printf ("%d\n", fac[ indeg[1] ]); continue; //不用特判也可以过
        for (int i = 1; i <= n; ++i)
            for (int j = 1; j <= n; ++j)
                a[i][j] = sub (a[i][j], 0);
        bool flag = false;
        for (int i = 1; i <= n; ++i)
            if (indeg[i] != outdeg[i])
                 printf ("0\n"), flag = true; break; 
        if (flag) continue;
        int ans = 1;
        for (int i = 1; i <= n; ++i)
            ans = mul (ans, fac[ indeg[i] - 1 ]);
        ans = mul (ans, mul (Guass(), indeg[1]));
        printf ("%d\n", ans);
    
    return 0;

Conclusion

又开始错各种细节了。

比如矩阵忘了去掉某一行,而是直接 \(n\) 行计算。

注意某一行我写了不用特判也可以,因为高斯消元里面返回的因该是 \(1\)

以上是关于bzoj3659Which Dreamed It的主要内容,如果未能解决你的问题,请参考以下文章

10.22~10.28一周经典题目整理(meeting,BZOJ4377,POJ3659)

English trip V1 - 21. I dreamed dream Teacher:Corrine Key: past tense(过去式)

VirusTotal智能搜索itw查找从github下载的恶意Android样本

VirusTotal智能搜索itw查找从github下载的恶意Android样本

bzoj1096ZJOI2007仓库建设

zoj3659