问一下大佬我这个的逻辑哪里有问题
查看原帖
问一下大佬我这个的逻辑哪里有问题
390929
Raja楼主2020/12/10 18:05
#include<stdio.h>
#define mod 1000000007
int num[5000]={0};
int main()
{
	int n;
	scanf("%d",&n);
	if(n<4){
		printf("0");
		return 0;
	}
	int i,j,x,max=0,min=5000;
	long long count=0,sum,k;
	for(i=0;i<n;i++){
		scanf("%d",&x);
		num[x]++;
		if(max<x){
			max=x;
		}
		if(min>x&&x!=0){
			min=x;
		}
	}
	
	for(i=max;i>min;i--){
		if(num[i]>=2){//最少两个相同的才能组合 
			for(sum=1,j=2;j<=num[i];j++){
				sum*=(j%mod);
			}
			k=sum>>1;//计算num[i]的组合数 
			
		    if(num[(i/2)]>=2 && !(i%2)){//只有是偶数而且它的二分起码有两个才进入计算 
			    for(sum=1,j=2;j<=num[(i/2)];j++){
				    sum*=(j%mod);
			    }
			    sum=(sum>>1);//求num[i]的二分的组合数 
			    count+=(k*sum)%mod;
		    }
		    
		    for(j=i-1;j>i/2;j--){
		    	if(num[j]&&num[i-j]){
		    		count+=(k*(num[j]*num[i-j]))%mod;
				}
			}
		}
	}
	count%=mod;
	printf("%lld",count);
	
	return 0;
}
2020/12/10 18:05
加载中...