题目描述

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

定义一种特殊的三元组: (x,y,z)(x,y,z) ,其中 x,y,zx,y,z 都代表纸带上格子的编号,这里的三元组要求满足以下两个条件:

  1. xyzxyz 是整数, x<y<z,y-x=z-yx<y<z,y−x=z−y

  2. colorx=colorzcolorx=colorz

满足上述条件的三元组的分数规定为 (x+z) \times (number\_x+number\_z)(x+z)×(number_x+number_z) 。整个纸带的分数规定为所有满足条件的三元组的分数的和。这个分数可能会很大,你只要输出整个纸带的分数除以 10,00710,007 所得的余数即可。

输入输出格式

输入格式:

第一行是用一个空格隔开的两个正整数 nn 和 m,nm,n 表纸带上格子的个数, mm 表纸带上颜色的种类数。

第二行有 nn 用空格隔开的正整数,第 ii 数字 numbernumber 表纸带上编号为 ii 格子上面写的数字。

第三行有 nn 用空格隔开的正整数,第 ii 数字 colorcolor 表纸带上编号为 ii 格子染的颜色。

输出格式:

一个整数,表示所求的纸带分数除以 1000710007 所得的余数。

输入输出样例

输入样例#1:

6 2
5 5 3 2 2 2
2 2 1 1 2 1
输出样例#1:

82
输入样例#2:

15 4
5 10 8 2 2 2 9 9 7 7 5 6 4 2 4
2 2 3 3 4 3 3 2 4 4 4 4 1 1 1
输出样例#2:

1388

说明

【输入输出样例 1 说明】

纸带如题目描述中的图所示。

所有满足条件的三元组为: (1, 3, 5), (4, 5, 6)(1,3,5),(4,5,6) 。

所以纸带的分数为 (1 + 5) \times (5 + 2) + (4 + 6) \times (2 + 2) = 42 + 40 = 82(1+5)×(5+2)+(4+6)×(2+2)=42+40=82 。

对于第 11 组至第 22 组数据, 1 ≤ n ≤ 100, 1 ≤ m ≤ 51≤n≤100,1≤m≤5 ;

对于第 33 组至第 44 组数据, 1 ≤ n ≤ 3000, 1 ≤ m ≤ 1001≤n≤3000,1≤m≤100 ;

对于第 55 组至第 66 组数据, 1 ≤ n ≤ 100000, 1 ≤ m ≤ 1000001≤n≤100000,1≤m≤100000 ,且不存在出现次数超过 2020 的颜色;

对 于 全 部 1010 组 数 据 , 1 ≤ n ≤ 100000, 1 ≤ m ≤ 100000, 1 ≤ color\_i ≤ m,1≤number\_i≤1000001≤n≤100000,1≤m≤100000,1≤color_i≤m,1≤number_i≤100000

Solution:

  本题zyys的普及题目。

  首先我们不难发现$2y=x+z$,所以$x,z$同奇或同偶,然后化简式子$(x+z)*(num_x+num_z)=x*num_x+x*num_z+z*num_z+z*num_x$。

  于是我们可以分开处理各颜色的奇偶数,然后同一颜色的同奇偶性的就直接求前缀和,最后只需要$O(n)$扫一遍,求每个颜色的方案数,累加统计求和就好了。

代码:

#include<bits/stdc++.h>
#define il inline
#define ll long long
#define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)>(b)?(b):(a))
using namespace std;
const int N=,mod=;
ll n,m,col[N][],num[N],sum[N][],c[N];
ll ans; il int gi(){
int a=;char x=getchar();bool f=;
while((x<''||x>'')&&x!='-')x=getchar();
if(x=='-')x=getchar(),f=;
while(x>=''&&x<='')a=(a<<)+(a<<)+x-,x=getchar();
return f?-a:a;
} int main(){
n=gi(),m=gi();
For(i,,n) num[i]=gi();
For(i,,n) {
c[i]=gi();
col[c[i]][i%]++;
sum[c[i]][i%]+=num[i];
}
For(i,,n)
if(col[c[i]][i%]->)
ans=(ans+i*num[i]*(col[c[i]][i%]-)%mod+i*(sum[c[i]][i%]-num[i])%mod)%mod;
cout<<ans;
return ;
}

最新文章

  1. HTLM4与HTML5的区别
  2. Python简易聊天工具-基于异步Socket通信
  3. 通信原理实践(二)&mdash;&mdash;幅度调制
  4. JavaScript焦点轮播图
  5. HTML5 Socket通信
  6. Self Numbers 分类: POJ 2015-06-12 20:07 14人阅读 评论(0) 收藏
  7. 安装express后却找不到express的命令
  8. PHP preg_replace() 正则替换所有符合条件的字符串示例
  9. C++中的冒泡排序,选择排序,插入排序
  10. python学习小结4:类
  11. Careercup - Facebook面试题 - 6204973461274624
  12. CreateTwoArray
  13. [Swust OJ 893]--Blocks
  14. 《白手起家Win32SDK应用程序》(完整版+目录)
  15. 监控mysql主从同步状态
  16. mysqldump 备份脚本
  17. 我眼中的Linux设备树(四 中断)
  18. mybatis随笔五之Executor
  19. UVA 11796 Dog Distance(几何)
  20. jquery动态出操作select

热门文章

  1. Win7下如何安装python pygame的whl包
  2. windows环境下安装scrapy框架报错问题--最快捷有效的解决方案
  3. ruby mysql2
  4. Kubernetes-GC
  5. ES6--Set之再理解
  6. 使用java多线程分批处理数据工具类
  7. express与ejs,ejs在Linux上面的路径问题
  8. Get Error when restoring database in Sql Server 2008 R2
  9. DO NOT BELIEVE HIS LIES 游戏随笔
  10. 「暑期训练」「Brute Force」 Far Relative’s Problem (CFR343D2B)