0
点赞
收藏
分享

微信扫一扫

牛客多校二

愚鱼看书说故事 2022-03-27 阅读 44

Counting Triangles

这道题题意是算有多少三边颜色完全相同的三角形,比赛中模拟三重循环得出答案,显然会超时
正确的题解,既然要算有多少个三边颜色完全相同的三角形个数,那等同于三角形个数-有异色边的三角形个数,
有异色边的三角形则是有俩个点的其中俩条边是异边,就是对于每个点算它有多少个异边相加/2,
这个通过计数黑色的点的总数*白色的点的总数得到.

#include<bits/stdc++.h>
typedef long long ll;
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(ll x) {
		z1=x;
		z2=(~x)^0x233333333U;
		z3=x^0x1234598766U;
		z4=(~x)+51;
		u = 0;
	}
}
using namespace GenHelper;

bool edge[8005][8005];
ll x[8005];
// int flag[10005];
ll ans;
int main() {
	ll n, seed;
	scanf("%lld %lld",&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();

	for(int i=0; i<n; i++) {
		ll a=0,b=0;
		for(int j=0; j<n; j++) {
            if(i==j)continue;
			if(!edge[i][j])a++;
			else b++;	
		}
		ans+=a*b;
	}
	printf("%lld",n*(n-1)*(n-2)/6-ans/2);
	return 0;
}
举报

相关推荐

0 条评论