列表

详情


NC201934. 图与三角形

描述

给定一张完全无向图,每条边是黑色或者白色,你需要求有几个同色三角形,也就是有多少  满足 ,且 (a,b),(b,c),(a,c) 同色。
为了防止输入过大,输入用一种奇怪的方式给出,详情见输入描述。

输入描述

第一行一个正整数 n 表示这张图的点数。
接下来第二行五个正整数 ,且
,然后我们规定,对于边 ,如果,则该边为黑色,否则为白色。

输出描述

输出一个数表示同色三角形个数,注意本题答案不需要取模

示例1

输入:

6
2 3 4 11 5

输出:

6

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 178ms, 内存消耗: 608K, 提交时间: 2020-02-01 17:52:55

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,a,b,c,p,d;
bool f(ll i,ll j)
{
	return (a*(i+j)*(i+j)+b*(i-j)*(i-j)+c)%p>d;
}
ll num[5005][2];
int main()
{
	ios::sync_with_stdio(false);
	ll n;
	cin>>n>>a>>b>>c>>p>>d;
	ll ans=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=i+1;j<=n;j++)
		{
			int t=f(i,j);
			num[i][t]++;
			num[j][t]++;
		}
		ans+=(num[i][0]*num[i][1]);
	}
	cout<<n*(n-1)*(n-2)/6-ans/2<<endl;
} 

C++11(clang++ 3.9) 解法, 执行用时: 528ms, 内存消耗: 604K, 提交时间: 2020-06-28 15:28:00

#include<cstdio>
int main()
{
  long long n,a,b,c,p,d;
  long long sum=0;
  scanf("%lld%lld%lld%lld%lld%lld",&n,&a,&b,&c,&p,&d);
  for(int i=1;i<=n;i++){
    int w[2]={};
    for(int j=1;j<=n;j++)
      ++w[(a*(i+j)*(i+j)+b*(i-j)*(i-j)+c)%p>d];
    --w[(a*(i+i)*(i+i)+b*(i-i)*(i-i)+c)%p>d];
    sum+=w[0]*w[1];
  }
  printf("%lld",(long long)n*(n-1)*(n-2)/6-sum/2);
  return 0;
}

上一题