题目描述

一条狭长的纸带被均匀划分出了 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:

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

  1. 82
输入样例#2:

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

  1. 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)$扫一遍,求每个颜色的方案数,累加统计求和就好了。

代码:

  1. #include<bits/stdc++.h>
  2. #define il inline
  3. #define ll long long
  4. #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
  5. #define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
  6. #define Max(a,b) ((a)>(b)?(a):(b))
  7. #define Min(a,b) ((a)>(b)?(b):(a))
  8. using namespace std;
  9. const int N=,mod=;
  10. ll n,m,col[N][],num[N],sum[N][],c[N];
  11. ll ans;
  12.  
  13. il int gi(){
  14. int a=;char x=getchar();bool f=;
  15. while((x<''||x>'')&&x!='-')x=getchar();
  16. if(x=='-')x=getchar(),f=;
  17. while(x>=''&&x<='')a=(a<<)+(a<<)+x-,x=getchar();
  18. return f?-a:a;
  19. }
  20.  
  21. int main(){
  22. n=gi(),m=gi();
  23. For(i,,n) num[i]=gi();
  24. For(i,,n) {
  25. c[i]=gi();
  26. col[c[i]][i%]++;
  27. sum[c[i]][i%]+=num[i];
  28. }
  29. For(i,,n)
  30. if(col[c[i]][i%]->)
  31. ans=(ans+i*num[i]*(col[c[i]][i%]-)%mod+i*(sum[c[i]][i%]-num[i])%mod)%mod;
  32. cout<<ans;
  33. return ;
  34. }

P2671 求和的更多相关文章

  1. 洛谷 P2671 求和 解题报告

    P2671 求和 题目描述 一条狭长的纸带被均匀划分出了\(n\)个格子,格子编号从\(1\)到\(n\) .每个格子上都染了一种颜色\(color_i\)用\([1,m]\)当中的一个整数表示),并 ...

  2. 洛谷P2671 求和 [数论]

    题目传送门 求和 格式难调,题面就不放了. 分析: $ZYYS$的一道题. 很显然是大力推公式.我们分析一下题目,实际上限制条件就是:下标同奇偶且颜色相同的数,那么我们先拿这个公式$(x+z)*(nu ...

  3. 洛谷 P2671 求和

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

  4. NOIP2015 普及组 洛谷P2671 求和 (数学)

    一道数学题...... 采用分组的思想,我们要统计答案的数对满足两个条件:同奇偶,同颜色.所以可以按这两个要求分组. 然后就是分组处理了,对于每组(有k个数),这里面的任意两对数都是满足条件的,可推出 ...

  5. T2695 桶哥的问题——吃桶

    ~~~~~我~是~真的~忍不了~这个~取模~的~锅~了~~~~~ T2695 桶哥的问题——吃桶 前传 1.T2686 桶哥的问题——买桶 这题真的hin简单,真的 2.T2691 桶哥的问题——送桶 ...

  6. 【桶哥的问题——吃桶-简化版】【洛谷p2671】求和

    求和=>[链接] 题目相较起_rqy出的要简单很多,来自noip普及组2015 化简这个式子:x+z=2y,故x与z mod 2同余,因此和桶哥的问题——吃桶一样的思路就可以做出来啦qwq: # ...

  7. [P2671][NOIP2015]求和 (数论)

    [题目链接] 这位大神讲得很详细:点我 本蒟蒻只会抄抄题解了 #include<bits/stdc++.h> #define max(a,b) (a>b?a:b) #define m ...

  8. Java程序:从命令行接收多个数字,求和并输出结果

    一.设计思想:由于命令行接收的是字符串类型,因此应先将字符串类型转化为整型或其他字符型,然后利用for循环求和并输出结果 二.程序流程图: 三.源程序代码:   //王荣荣 2016/9/23     ...

  9. Java之递归求和的两张方法

    方法一: package com.smbea.demo; public class Student { private int sum = 0; /** * 递归求和 * @param num */ ...

随机推荐

  1. jQuery最重要的知识点

    1.各种常见的选择器.2.对于属性的操作.[重点] 2.1)获取或设置属性的值: prop(); 2.2 ) 添加.删除.切换样式: addClass/removeClass/toggleClass ...

  2. collections模块的使用

    1. Counter counter是collections中的一个模块, 它能够统计出字符串/文本中的每一个元素出现的次数, 并可以对结果进行进一步的处理. 使用方法 传入: 字符串 默认返回: C ...

  3. I/O流、ZIP文档

    1) ZIP文档通常以压缩格式存储一个或多个文档.在Java中可以用ZipInputStream读入ZIP文档(即解压文件流),用ZipOutputStream写入ZIP文档(即压缩文件流),无论解压 ...

  4. Python序列删除重复数据

    ## 对于列表来说,若不保持原有顺序,可以直接转换为set删除重复数据 nums = [1,2,32,2,2,4,3,2,3,42] nums = list(set(nums)) print(nums ...

  5. php 删除富文本编辑器保存内容中的其他代码(保留中文)

    $str = '<p><p style="ve:&quot;">测试筛选文本域内的中文 </p><p sty;"> ...

  6. laydate js动态添加时间

    $("#test2").click(function(){ var input=$('<input/>'); $("#test1").append( ...

  7. ExceL按记录导出Txt 工具

    根据客户要求,开发此工具,每一条记录改出一个Txt文本,文本名取其中一字段数据

  8. python中一些内置函数实例

    lambda表达式 简单函数可用lambda表达式 1. def f1() return(123) r1=f1() print() 2. f2=lambda:123 r2=f2() print() 以 ...

  9. Redis缓存数据库的安装与配置(3)

    3 Redis主动同步设置方法 Redis主从同步 1.Redis主从同步特点 一个master可以拥有多个slave 多个slave可以连接同一个master,还可以连接到其他slave 主从复制不 ...

  10. Android开发——View绘制过程源码解析(二)

    0. 前言   View的绘制流程从ViewRoot的performTraversals开始,经过measure,layout,draw三个流程,之后就可以在屏幕上看到View了.上一篇已经介绍了Vi ...