求个hack
查看原帖
求个hack
261932
qpdk777楼主2020/7/28 16:10
#include<iostream>
#include<cstdio>
typedef long long int ll;
using namespace std;

ll n,a[200010],num[200010],pre[400100],ans,j[200010];
const ll mod = 998244353;

ll c(ll n,ll m){//组合数 
	ll ans = 0;
	if(n == 2)
		ans = m*(m-1)/2;
	if(n == 3)
		ans = m*(m-1)*(m-2)/6;
	return ans;
}

int main(){
	ios::sync_with_stdio(false),cin.tie(NULL);
	cin>>n;
	if(n<3){
		cout<<0<<endl;
		return 0;
	}
	for(int i = 1; i <= n; ++i){
		cin>>a[i]; 
		++num[a[i]];//num[x]表示长度为x的木棍数量 
	}
	for(int i = 1; i <= 400010; ++i)//多打一倍的长度 
		pre[i] = pre[i-1]+num[i];//前缀和,之后会进一步处理的 
	for(int i = 1; i <= 200000; ++i){
		if(num[i]>=2 && pre[2*i]-num[2*i]>=num[i])//围成等腰不等边三角形的数量 
			ans += c(2,num[i])*(pre[2*i]-num[2*i]-num[i]);//pre[2*i]-num[2*i]表示长度小于2*i的木棍数量,再减去num[i]排除等边的情况 
		if(num[i]>=3)//等边需要三个以上相同长度的木棍 
			ans += c(3,num[i]);
		ans %= mod;//取模 
	}
	cout<<ans<<endl;
	
	return 0;
}
2020/7/28 16:10
加载中...