1. 程式人生 > >洛谷——P3909 異或之積

洛谷——P3909 異或之積

ace bin i++ copy res urn iostream char sample

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 異或之積