2021牛客暑期多校訓練營3 J. Counting Triangles(容斥原理)

 
來源:牛客網c++

題目描述

Goodeat finds an undirected complete graph with n vertices. Each edge of the graph is painted black or white. He wants you to help him find the number of triangles (a, b, c) (a < b < c), such that the edges between (a, b), (b, c), (c, a) have the same color. To avoid the input scale being too large, we use the following code to generate edges in the graph. namespace GenHelper { unsigned z1,z2,z3,z4,b,u; unsigned get() { b=((z1<<6)^z1)>>13; z1=((z1&4294967294U)<<18)^b; b=((z2<<2)^z2)>>27; z2=((z2&4294967288U)<<2)^b; b=((z3<<13)^z3)>>21; z3=((z3&4294967280U)<<7)^b; b=((z4<<3)^z4)>>12; z4=((z4&4294967168U)<<13)^b; return (z1^z2^z3^z4); } bool read() { while (!u) u = get(); bool res = u & 1; u >>= 1; return res; } void srand(int x) { z1=x; z2=(~x)^0x233333333U; z3=x^0x1234598766U; z4=(~x)+51; u = 0; } } using namespace GenHelper; bool edge[8005][8005]; int main() { int n, seed; cin >> n >> seed; srand(seed); for (int i = 0; i < n; i++) for (int j = i + 1; j < n; j++) edge[j][i] = edge[i][j] = read(); return 0; }
The edge array in the above code stores the color of the edges in the graph. edge[i][j]=1 means that the edge from i to j is black, otherwise it is white (∀0≤i≠j≤n−1∀0≤i\​=j≤n−1).app

Ensure that there is an approach that does not depend on the way the data is generated.dom

輸入描述:

The first line contains two integers n(n≤8000),seed(seed≤109)n(n≤8000),seed(seed≤109), denote the number of vertices and the seed of random generator.

輸出描述:

Output a line denoting the answer.

示例1ide

輸入

複製spa

10 114514

輸出

複製code

35

說明

There're 35 triangles that all three edges have the same color.

考慮容斥,直接用總數減不知足條件的三角形的個數。總數就是\(C_n^3\),且能夠注意到不知足條件的三角形必定是兩個邊爲0一個邊爲1或者兩個邊爲1一個邊爲0,即一個三角形中有兩個全部關聯邊異色的頂點和一個全部關聯邊同色的頂點。而後能夠枚舉頂點統計關聯邊異色的頂點個數,除以2就是不知足條件的三角形個數。three

#include <bits/stdc++.h>
namespace GenHelper
{
    unsigned z1,z2,z3,z4,b,u;
    unsigned get()
    {
        b=((z1<<6)^z1)>>13;
        z1=((z1&4294967294U)<<18)^b;
        b=((z2<<2)^z2)>>27;
        z2=((z2&4294967288U)<<2)^b;
        b=((z3<<13)^z3)>>21;
        z3=((z3&4294967280U)<<7)^b;
        b=((z4<<3)^z4)>>12;
        z4=((z4&4294967168U)<<13)^b;
        return (z1^z2^z3^z4);
    }
    bool read() {
      while (!u) u = get();
      bool res = u & 1;
      u >>= 1; return res;
    }
    void srand(int x)
    {
        z1=x;
        z2=(~x)^0x233333333U;
        z3=x^0x1234598766U;
        z4=(~x)+51;
      	u = 0;
    }
}
using namespace GenHelper;
using namespace std;
bool edge[8005][8005];
int main() {
    int n, seed;
    cin >> n >> seed;
    srand(seed);
    for (int i = 1; i <= n; i++) {
    	for (int j = i + 1; j <= n; j++) {
        	edge[j][i] = edge[i][j] = read();
        }
    }
    long long cnt = 0, all = 0;
    for(int i = 1; i <= n; i++) {
        long long tmp = 0;
        long long x = 0, y = 0;
        for(int j = 1; j <= n; j++) {
            if(i == j) continue;
            if(edge[i][j]) x++;
            else y++;
        }
        cnt += x * y;
    }
    cout << 1ll * n * (n - 1) * (n - 2) / 6 - cnt / 2;
 	return 0;
}
相關文章
相關標籤/搜索