洛谷——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 个整数,表示所求的值。
输入输出样例
说明
• 对于30% 的数据,3 \le N \le 5003≤N≤500;
• 对于60% 的数据,3 \le N \le 50003≤N≤5000;
• 对于100% 的数据,3 \le N \le 10^6,0 \le A_i \le 10^93≤N≤106,0≤Ai?≤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 异或之积的主要内容,如果未能解决你的问题,请参考以下文章