本文主要是介绍CSUSTOJ 你真的会图论吗?(三色三角形),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
思路:
就是三色三角形问题,直接容斥。算出每个点白色和黑色的边有多少个,那么可以算出每个点对应的非三色三角形个数。总数减掉非三色三角形个数即可。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <iostream>
#include <map>
#include <string>using namespace std;typedef long long ll;const int mod = 1e9 + 7;
const int maxn = 5000 + 7;int a[maxn][maxn],W[maxn],R[maxn];//每个点对应的颜色边数int main() {ll n;scanf("%lld",&n);ll A,B,C,P,D;scanf("%lld%lld%lld%lld%lld",&A,&B,&C,&P,&D);for(int i = 1;i <= n;i++) {for(int j = 1;j <= n;j++) {if(i == j) continue;ll num = A * (i + j) * (i + j) + B * (i - j) * (i - j) + C;if(num % P > D) R[i]++;else W[i]++;}}ll ans = 0,sum = n * (n - 1) * (n - 2) / 6;for(int i = 1;i <= n;i++) {ans += R[i] * W[i];}printf("%lld\n",sum - ans / 2);return 0;
}
这篇关于CSUSTOJ 你真的会图论吗?(三色三角形)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!