xtuoj 两个数
题目
思路
从数组中取出两个元素,将其拆分成若干个1,然后加到剩余元素里面,使得剩余的 n-2 个元素值都相等,求这样的取法有多少种。
一,由于取出来的元素都加到剩余元素里面了,所以元素的总和保持不变。
二,剩余n-2个元素的值都相等,且总和为S,所以剩余每个元素应该最后是S/(n-2)。
三,由于元素拆分为若干个1,所以如果剩余每个元素最后应该是整数,那么S%(n-2)==0,如果不满足,则不存在这样的取法。
四,由于只能加不能减,所以我们必须要把 >T 的取出来,要保证剩下的元素都 <= T。
五,由于只能取两个元素,所以如果 >T 的个数 >2,则不存在这样的取法;如果 >T 的元素是两个,那么把这两个取出来即可,就这一种取法;如果 >T 的元素只有 1 个,那么我们把这个元素取出来,然后剩余元素随便取出一个即可,就是n-1种取法,因为取出这个 >T 的元素后,剩余部分都 <= T,且总和不变,剩余元素个数为 n-2 个,所以都可以通过加法实现让其等于 T;如果没有 >T 的元素,那么直接随便选两个即可,就是。
代码
#include<stdio.h>
#define ll long long
#define N 100005int main(){ll n,S=0,cnt=0,ans;scanf("%lld",&n);ll a[N];for(int i=0;i<n;i++){scanf("%lld",&a[i]);S+=a[i];}ll T=S/(n-2);for(int i=0;i<n;i++) if(a[i]>T) cnt++;if(S%(n-2)!=0) ans=0;else{if(cnt>2) ans=0;else if(cnt==2) ans=1;else if(cnt==1) ans=n-1;else if(cnt==0) ans=n*(n-1)/2;}printf("%lld\n",ans);return 0;
}