- 简单题
 - @ 2017-08-21 19:46:32
 
60很顺利:
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=200010;
const ll mod=1000000007;
ll a[maxn],r[maxn];
ll q_m(ll a,ll b){
    ll ret=1;
    while(b>0){
        if(b&1){
            ret*=a%mod;
            ret%=mod;
        }
        a*=a%mod;
        a%=mod;
        b>>=1;
    }
    return ret;
}
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;++i)cin>>a[i];
    for(int i=0;i<=n;++i)r[i]=q_m(2,i);
    sort(a+1,a+n+1);
    ll ans=0;
    for(int i=1;i<=n;++i){
        for(int j=i+1;j<=n;++j){
            ans+=((a[j]-a[i])*r[j-i-1])%mod;
            ans%=mod;
        }
    }
    cout<<ans;
    return 0;
}
预处理一些新的就行了
请问我模错在哪????
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=200010;
const ll mod=1000000007;
ll a[maxn],r[maxn],k[maxn];
ll q_m(ll a,ll b){
    ll ret=1;
    while(b>0){
        if(b&1){
            ret*=a%mod;
            ret%=mod;
        }
        a*=a%mod;
        a%=mod;
        b>>=1;
    }
    return ret;
}
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;++i)cin>>a[i];
    for(int i=0;i<=n;++i)r[i]=q_m(2,i);
    k[0]=1;
    for(int i=1;i<=n;++i)k[i]=(k[i-1]+r[i])%mod;
    sort(a+1,a+n+1);
    ll ans=0;
    int sum=0;
    for(int j=2;j<=n;++j){
        sum+=((a[j]-a[1])*r[j-2])%mod;
        sum%=mod;
    }
    for(int i=1;i<=n;++i){
        ans=(sum+ans)%mod;
        if(n-i-2==-1)break;
        sum-=(a[i+1]-a[i]);
        sum/=2;
        sum=(sum%mod+(a[i]-a[i+1])*k[n-i-2]%mod+mod)%mod;
    }
    cout<<ans;
    return 0;
}
2 条评论
- 
  Megumin LV 8 @ 2017-08-21 22:27:19
sum不能直接除2,请乘上2的逆元
顺便,楼主能大致讲下此题做法? - 
  @ 2017-08-21 19:48:42
round1的#2: 简单题
 
- 1
 
信息
- 难度
 - 7
 - 分类
 - (无)
 - 标签
 - 递交数
 - 25
 - 已通过
 - 6
 - 通过率
 - 24%
 - 被复制
 - 1
 - 上传者