您的位置:首页 > 其它

NOIP2015pj求和

2016-08-21 16:34 197 查看

题目描述

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



定义一种特殊的三元组:(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)+偶[b]*num*(cnt偶-2)[/b]

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

[b]WARN:一定多%%%%%%%%%%%%[/b]

#include <iostream>
#include <cstdio>
using namespace std;
const int N=1e5+5,MOD=10007;
inline int read(){
char c=getchar(); int x=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
int n,m,ans=0;
int col
,num
,sum[2]
,cnt[2]
;
int main(int argc, const char * argv[]) {
n=read();m=read();
for(int i=1;i<=n;i++) num[i]=read()%MOD;
for(int i=1;i<=n;i++){
col[i]=read();
sum[i%2][col[i]]=(sum[i%2][col[i]]+num[i])%MOD;
cnt[i%2][col[i]]++;
}
for(int i=1;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%10007*((sum[i%2][col[i]]+(cnt[i%2][col[i]]-2)%10007*num[i]+10007)%10007))%10007;
}
cout<<ans;
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: