hdu 4655 Cut Pieces
这个解题报告讲的很详细了!!!
代码如下:
1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 #include<iomanip> 5 #include<cmath> 6 #include<cstring> 7 #include<vector> 8 #define ll __int64 9 #define pi acos(-1.0) 10 #define MAX 1000010 11 #define mod 1000000007 12 using namespace std; 13 int an[MAX]; 14 ll s,ans,temp; 15 ll pows(ll a,ll b){ 16 ll ans=1; 17 while(b){ 18 if(b&1) ans=(ans*a)%mod; 19 b>>=1; 20 a=(a*a)%mod; 21 } 22 return ans; 23 } 24 int main(){ 25 int t,i,j,n; 26 cin>>t; 27 while(t--){ 28 cin>>n; 29 s=1; 30 for(i=0;i<n;i++){ 31 scanf("%d",&an[i]); 32 s*=an[i]; 33 s%=mod; 34 } 35 sort(an,an+n); 36 j=n-1; 37 ans=n*s%mod; 38 temp=0; 39 for(i=n-1;i>=0;i--){ 40 if(!j) break; 41 ll tt=s*pows(an[i],mod-2)%mod; 42 temp=(tt+temp)%mod; 43 j--; 44 if(!j) break; 45 temp=(tt+temp)%mod; 46 j--; 47 if(!j) break; 48 } 49 printf("%I64d\n",((ans-temp)%mod+mod)%mod); 50 } 51 return 0; 52 }