Codeforces Round #198 (Div. 2) —— C
C题很容易看懂题目,不过两个循环肯定会TLE,所以得用点小聪明;
首先排好序,因为是全排列,乱序和顺序的结果是一样的;
然后呢····
如果是数列 1 2 3 4 5
元素1 被 2 3 4 5每个减了2次,它自己减0一次;相抵后为-7;
元素2 被 3 5 4 每个减了2次,它减1两次,减0一次;相抵后为 -3;
元素3 相抵后为1;
可以发现他们的数量相差4;这样就好办了,一个循环就搞定了;
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 int a[100009]; 6 long long gcd(long long a,long long b) 7 { 8 return b==0?a:gcd(b,a%b); 9 } 10 int main() 11 { 12 long long ans=0,n,t; 13 cin>>n; 14 for(long long i=0; i<n; i++) 15 scanf("%d",&a[i]); 16 sort(a,a+n); 17 t=3-2*n; 18 for(long long i=0; i<n; i++,t+=4) 19 ans+=a[i]*t; 20 long long k=gcd(ans,n); 21 cout<<ans/k<<" "<<n/k<<endl; 22 return 0; 23 }