NC201934. 图与三角形
描述
输入描述
第一行一个正整数 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; }