首页 > 其他 > 详细

【洛谷P3909】异或之积

时间:2019-04-30 23:17:14      阅读:144      评论:0      收藏:0      [点我收藏+]

题目大意:给定一个 N 个数字组成的序列,求
\[ \left(6 \times \sum_{i=1}^{N} \sum_{j=i+1}^{N} \sum_{k=j+1}^{N} A_{i} \times A_{j} \times A_{k}\right) \bmod \left(10^{9}+7\right) \]

题解:
各个变量之间相互独立是优化的前提。
\[ \begin{array}{l}{\sum_{i=1}^{n} \sum_{j=i+1}^{n} \sum_{k=j+1}^{n} a_{i} a_{j} a_{k}} \\ {=\sum_{i=1}^{n} a_{i} \sum_{j=i+1}^{n} a_{j} \sum_{k=j+1}^{n} a_{k}} \\ {=\sum_{i=1}^{n} a_{i} \sum_{j=i+1}^{n} a_{j} C_{j+1}} \\ {=\sum_{i=1}^{n} a_{i} B_{i+1}} \\ {=\sum_{i=1}^{n} a_{i} B_{i+1}} \\ {=A_{1}}\end{array} \]

代码如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
const int mod=1e9+7;
typedef long long LL;

LL n,a[maxn],sum1[maxn],sum2[maxn],sum3[maxn];

void read_and_parse(){
    scanf("%lld",&n);
    for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    for(int i=1;i<=n;i++)sum1[i]=(sum1[i-1]+a[i])%mod;
    for(int i=1;i<=n;i++)sum2[i]=(sum2[i-1]+(sum1[n]-sum1[i]+mod)%mod*a[i]%mod)%mod;
    for(int i=1;i<=n;i++)sum3[i]=((sum2[n]-sum2[i]+mod)%mod*a[i]%mod+sum3[i-1])%mod;
}

void solve(){
    LL ans=6*sum3[n]%mod;
    printf("%lld\n",ans);
}

int main(){
    read_and_parse();
    solve();
    return 0;
}

【洛谷P3909】异或之积

原文:https://www.cnblogs.com/wzj-xhjbk/p/10798263.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!