NOIP2015pj求和

题目描述

一条狭长的纸带被均匀划分出了n个格子,格子编号从1到n。每个格子上都染了一种颜色color_i用[1,m]当中的一个整数表示),并且写了一个数字number_i。

NOIP2015pj求和

定义一种特殊的三元组:(x,y,z),其中x,y,z都代表纸带上格子的编号,这里的三元

组要求满足以下两个条件:

1.xyz是整数,x<y<z,y-x=z-y

2.colorx=colorz

满足上述条件的三元组的分数规定为(x+z)*(number_x+number_z。整个纸带的分数

规定为所有满足条件的三元组的分数的和。这个分数可能会很大,你只要输出整个纸带的分数除以10,007所得的余数即可。

-------------------------------------------------------------------------------------------------------------------

需要一点数学推导,对于一种颜色,就是sigma奇*sigma num奇+sigma偶*sigma num偶+奇*num*(cnt奇-2)+偶*num*(cnt偶-2)

预处理sum和cnt数组,然后扫一遍统计答案行了

WARN:一定多%%%%%%%%%%%%

#include <iostream>
#include <cstdio>
using namespace std;
const int N=1e5+,MOD=;
inline int read(){
char c=getchar(); int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,m,ans=;
int col[N],num[N],sum[][N],cnt[][N];
int main(int argc, const char * argv[]) {
n=read();m=read();
for(int i=;i<=n;i++) num[i]=read()%MOD;
for(int i=;i<=n;i++){
col[i]=read();
sum[i%][col[i]]=(sum[i%][col[i]]+num[i])%MOD;
cnt[i%][col[i]]++;
}
for(int i=;i<=n;i++){
// ans=(ans+(i%MOD*sum[i%2][col[i]])%MOD+(i%MOD*num[i]*(cnt[i%2][col[i]]-2)+MOD)%MOD)%MOD;
ans=(ans+i%*((sum[i%][col[i]]+(cnt[i%][col[i]]-)%*num[i]+)%))%;
}
cout<<ans;
return ;
}
上一篇:Sencha app build 出现 missing name after . operator 问题


下一篇:Hibernate 表映射 主键生成策略与复合主键