洛谷——P3909 异或之积

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷——P3909 异或之积相关的知识,希望对你有一定的参考价值。

P3909 异或之积

题目描述

对于A_1,A_2,A_3,\cdots,A_NA1?,A2?,A3?,?,AN?,求

(6\times \sum_{i=1}^N\sum_{j=i+1}^N\sum_{k=j+1}^N A_i\times A_j\times A_k)\ mod\ (10^9+7)(6×i=1N?j=i+1N?k=j+1N?Ai?×Aj?×Ak?) mod (109+7)

的值。

输入输出格式

输入格式:

 

第1 行,1 个整数NN。

第2 行,NN个整数A_1,A_2,A_3,\cdots,A_NA1?,A2?,A3?,?,AN?.

 

输出格式:

 

1 个整数,表示所求的值。

 

输入输出样例

输入样例#1: 复制
3
1 2 3
输出样例#1: 复制
36

说明

• 对于30% 的数据,3 \le N \le 5003N500;

• 对于60% 的数据,3 \le N \le 50003N5000;

• 对于100% 的数据,3 \le N \le 10^6,0 \le A_i \le 10^93N106,0Ai?109。

 

将上面给出的式子展开,然后代入数以后找规律,提取公因式加上前缀和处理,然后就好了

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 1000100
#define LL long long
#define mod 1000000007
using namespace std;
LL n,a[N],s1[N],s2[N],ans;
LL read()
{
    LL x=0,f=1; char ch=getchar();
    while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}
    while(ch>=0&&ch<=9) x=x*10+ch-0,ch=getchar();
    return  x*f;
}
int main()
{
    n=read(); 
    for(int i=1;i<=n;i++) a[i]=read();
    for(int i=n;i>=3;i--) 
     s1[i]=(s1[i+1]+a[i])%mod;
    for(int i=n;i>=2;i--) 
     s2[i]=(s2[i+1]+a[i]*s1[i+1])%mod;
    for(int i=1;i<=n;i++)
     ans=(ans+a[i]*s2[i+1]%mod);
    ans=6*ans%mod;
    printf("%lld",ans);
    return 0;
}

 

以上是关于洛谷——P3909 异或之积的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 3689: 异或之

BZOJ3689异或之 堆+可持久化Trie树

洛谷P4735 最大异或和

洛谷 [P4151] 最大异或和路径

洛谷 P4551 最长异或路径

洛谷 [P2420] 让我们异或吧