码迷,mamicode.com
首页 > 其他好文 > 详细

洛谷——P3909 异或之积

时间:2017-11-29 22:46:39      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:define   for   cstring   names   using   输入输出   class   复制   apple   

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 异或之积

标签:define   for   cstring   names   using   输入输出   class   复制   apple   

原文地址:http://www.cnblogs.com/z360/p/7923040.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!