HDU 4655 Cut Pieces

来源:互联网 发布:淘宝客软件有免费的吗 编辑:程序博客网 时间:2024/05/17 00:12
/*题意:输入一组n长的序列ai,表示n个格子的各自能涂的颜色数,颜色为1~ai。求找出ai的一种  排列,使得所有颜色组合的sum和最大,sum表示一种颜色组合的片数,连续的相同颜色算一片, 输出最大的sum和  c=n*s-(s/min(b1,b2)+s/min(b2,b3)+...+s/min(bn-1,bn))(a/b)%mod<-->(a%mod*pow(b,mod-2))%mod */#include <iostream>#include <cstdio>#include <algorithm>using namespace std;#define ll __int64const int mod =1000000007;const int maxn = 1000005;ll a[maxn],b[maxn];inline ll p(ll b){ll t = mod-2;ll res =1,x=b;while(t){if(t&1) res=(res*x)%mod;x=(x*x)%mod;t>>=1;}return res;}int main(){int t,n;ll s,c;scanf("%d",&t);while(t--){s=1;c=0;scanf("%d",&n);for(int i=1;i<=n;++i){ scanf("%I64d",&a[i]); s=(s*a[i])%mod;}sort(a+1,a+n+1);for(int i=1,j=n;i<=j;i++,j--){if(i!=j)b[2*i]=a[j];b[2*i-1]=a[i];}for(int i=2;i<=n;++i){if(i%2==0){if(i==n) c+=p(b[i])*s;else c+=2*s*p(b[i]);c=c%mod;}}c=(n*s-c)%mod;if(c<0) c+=mod;printf("%I64d\n",c);}}

原创粉丝点击