超时怎么优化呢?
查看原帖
超时怎么优化呢?
592681
ran_Diana楼主2022/6/27 20:11
#include<bits/stdc++.h>
#define ll long long 
using namespace std;
const int p=1e9+7;
ll n,m,pre[10000000],a[10000000],maxn=-1,minn=p,ans;
ll num[10000000];
ll ksm(ll a,ll b)
{
	ll ans=1;
	while(b){
		if(b&1) ans=(ans*a)%p;
		a=(a*a)%p;
		b>>=1;
	}
	return ans%p;
}
ll C(ll n,ll m,ll p=1e9+7)
{
	
	if(n<=m) return 1;
	return (pre[n]*ksm((pre[m]*pre[n-m])%p,p-2))%p;
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		maxn=max(maxn,a[i]);
		minn=min(minn,a[i]);
		num[a[i]]++;
	}	
	pre[1]=1;
	for(ll i=2;i<=1000000;i++) pre[i]=pre[i-1]*i%p;
	for(int i=minn;i<=maxn;i++)
		{
			ll xx=C(num[i],2);
			if(num[i]<2) continue;
			else
			{
				for(int j=minn;j<=i/2;j++)
				{
					if(j!=i-j&&num[j]>=1&&num[i-j]>=1)
						ans+=xx*C(num[j],1)*C(num[i-j],1);
					if(j==i-j&&num[j]>=2)
						ans+=xx*C(num[j],2);	
				}
			}
		}
		cout<<ans%p;
	return 0;
}

膜拜大佬

2022/6/27 20:11
加载中...