3. 求和

难度级别:B; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B

题目描述

  一条狭长的纸带被均匀划分出了n个格子,格子编号从1到n。每个格子上都染了一种颜色colori用[1,m]当中的一个整数表示),并且写了一个数字numberi。
5
5
3
2
2
2
编号
1
2
3
4
5
6
 
定义一种特殊的三元组:(x, y, z),其中x,y,z都代表纸带上格子的编号,这里的三元组要求满足以下两个条件:
组要求满足以下两个条件:
    1.  xyz是整数,x<y<z,y-x=z-y
    2.  colorx=colorz
    满足上述条件的三元组的分数规定为(x+z)*(numberx+numberz)。整个纸带的分数规定为所有满足条件的三元组的分数的和。这个分数可能会很大,你只要输出整个纸带的分数除以10,007所得的余数即可。
 
【输入输出样例1】
 
sum.in
sum.out
6
2
       
82
5
5
3
2
2
2
2
2
1
1
2
1
 
 
【输入输出样例1 说明】 纸带如题目描述中的图所示。
所有满足条件的三元组为:(1,3,5),(4,5,6)。
所以纸带的分数为(1+5)* (5+2)+ (4+6) *(2+2)=42+40=82。
 
【输入输出样例2】
 
sum.in
sum.out
 

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

 
1388
 
【数据说明】
对于第 1 组至第 2 组数据, 1 ≤ n ≤ 100, 1 ≤ m ≤ 5;
对于第 3 组至第 4 组数据, 1 ≤ n ≤ 3000, 1 ≤ m ≤ 100;
对于第 5 组至第 6 组数据, 1 ≤ n ≤ 100000, 1 ≤ m ≤ 100000,且不存在出现次数超过 20 的颜色;
对 于 全 部 10 组 数 据 , 1 ≤ n ≤ 100000, 1 ≤ m ≤ 100000, 1 ≤ colori ≤ m,1≤ numberi ≤100000

输入

第一行是用一个空格隔开的两个正整数n和m,n表纸带上格子的个数,m表纸带上颜色的种类数。
第二行有n用空格隔开的正整数,第i数字numberi表纸带上编号为i格子上面写的数字。
第三行有n用空格隔开的正整数,第i数字colori表纸带上编号为i格子染的颜色。

输出

共一行,一个整数,表示所求的纸带分数除以10,007 所得的余数。

样例输入

6 2 5 5 3 2 2 2 2 2 1 1 2 1

样例输出

82
 
数学不好的人就别往下看了(友情提示)。
 
 
 
 
 
 
这题一看就是数学问题。求彩带分数和的式子需要运用一点数学思维化简(化简成计算机能快速算出的)
比如说:
  设同奇偶且同一种颜色的每个格子中的格子编号为a,b,c,d,....,分数为aa,bb,cc,dd,...
  由于这些格子中要两两计算分数并相加,因此我们来看看能不能把这个数学计算化简下
   
    有两个格子满足条件时的分数和是
        (a+b)*(aa+bb)
     (=0*(a*aa+b*bb)+(a+b)*(aa+bb))
    
    有三个格子满足条件时的分数和是
        (a+b)*(aa+bb)+(a+c)*(aa+cc)+(b+c)*(bb+cc)
       =a*aa+b*bb+c*cc+a*(aa+bb+cc)+b*(aa+bb+cc)+c*(aa+bb+cc) 【把上面那个式子的因式全都分解开,再合并一下,就能合成这样,没难度】
       =a*aa+b*bb+c*cc+(a+b+c)*(aa+bb+cc)
     (=1*(a*aa+b*bb+c*cc)+(a+b+c)*(aa+bb+cc))
    
    有四个格子满足条件时的分数和是
        (a+b)*(aa+bb)+(a+c)*(aa+cc)+(a+d)*(aa+dd)+(b+c)*(bb+cc)+(b+d)*(bb+dd)+(c+d)*(cc+dd)
       =2*(a*aa+b*bb+c*cc+d*dd)+a*(aa+bb+cc+dd)+b*(aa+bb+cc+dd)+c*(aa+bb+cc+dd)+d*(aa+bb+cc+dd)
       =2*(a*aa+b*bb+c*cc+d*dd)+(a+b+c+d)*(aa+bb+cc+dd)
 
  相信接下来大家已经发现规律了:
 
      正常的像(a+b+c+...)*(aa+bb+cc+...)这样的因式的增项就不说了,主要是注意每多一个格子满足条件时,每个格子就多加一次自身的编号和数字((?)*(a*aa+b*bb+...)
  因此用数(哲♂)学做法:
      设ci为格子颜色,j为0时表示这些三元组的x,z均为偶数,j为1时则均为奇数。
      设之前出现过的与之同奇偶p同颜色ci的格子数设为cnt[ci][p],
      格子序号和color[ci][0][p],格子数字和color[ci][1][p],格子序号与数字之积之和为color[ci][2][p]。
      当所有格子(所有颜色的格子)满足条件时,分数和为
         for(i=1;i<=m;i++)
             for(j=0;j<=1;j++){
                 sum+=color[i][0][j]*color[i][1][j]+((cnt[i][j]-2)*color[i][2][j]);
                 sum%=10007;

}

#include<iostream>
#include<cstring>
#define maxn 100005
using namespace std;
long long color[maxn][3][2],number[maxn],cnt[maxn][2],n,m,sum;
/*
之前出现过的与之同奇偶p同颜色ci的格子数设为cnt[ci][p],
格子序号和color[ci][0][p],格子数字和color[ci][1][p],格子序号与数字之积之和为color[ci][2][p]
*/
int main(){
int cor,i,j;
scanf("%lld%lld",&n,&m);
for(i=1;i<=n;i++) scanf("%lld",&number[i]);
for(i=1;i<=n;i++){
scanf("%d",&cor);
cnt[cor][i&1]++;
(color[cor][0][i&1]+=i)%=10007;
(color[cor][1][i&1]+=number[i])%=10007;
(color[cor][2][i&1]+=number[i]*i)%10007;
}
for(i=1;i<=m;i++)
for(j=0;j<=1;j++){
sum+=(color[i][0][j]*color[i][1][j])%10007+((cnt[i][j]-2)*color[i][2][j])%10007;
sum%=10007;
}
printf("%lld\n",sum);
system("pause");
return 0;
}

  我也查了网上别人的题解,我相信我这是最详细的了,因为我抠了一个多小时这题→_→

【noip】noip201503求和(市赛后公布)的更多相关文章

  1. 【noip】noip201503求和(题解可能不完美,但绝对详细)

    3. 求和 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 题目描述   一条狭长的纸带被均匀划分出了n个格子,格子编号从1到n.每个格子 ...

  2. 牛客NOIP暑期七天营-TG1 赛后题解

    目录 牛客NOIP暑期七天营-提高组1 A-最短路 题目描述 link 题解 代码 B-最小生成链 题目描述 link 题解 代码 C-最小字典最短路 题目描述 link 题解 Update 牛客NO ...

  3. 6.17考试总结(NOIP模拟8)[星际旅行·砍树·超级树·求和]

    6.17考试总结(NOIP模拟8) 背景 考得不咋样,有一个非常遗憾的地方:最后一题少取膜了,\(100pts->40pts\),改了这么多年的错还是头一回看见以下的情景... T1星际旅行 前 ...

  4. 牛客NOIP暑期七天营-TG3 赛后题解

    目录 牛客NOIP暑期七天营-提高组3 A-破碎的矩阵 题目描述 link 题解 代码 B-点与面 题目描述 link 题解 代码 C-信息传递 题目描述 link 题解 牛客NOIP暑期七天营-提高 ...

  5. noip模拟8[星际旅行·砍树·超级树·求和]

    也不能算考得好,虽然这次A了一道题,但主要是那道题太简单了,没啥成就感,而且有好多人都A掉了 除了那一道,其他的加起来一共拿了25pts,这我能咋办,无奈的去改题 整场考试的状态并不是很好啊,不知道是 ...

  6. [hgoi#2019/3/21]NOIP&NOI赛后总结

    前言 今天做的是是2010年提高组和NOI的题目,做过几道原题,但是还是爆炸了,我真的太弱了. t1-乌龟棋 https://www.luogu.org/problemnew/show/P1541 这 ...

  7. NOIP 2017 赛后反思 [补档]

    首先写一下比赛的情况: D1: T1: 之前做过类似的题目, 因而知道大致的结论, 迅速完成. T2: 貌似直接模拟就可以了, 涉及到字符串信息提取, 比较麻烦, 因而想放到最后做. T3: 非常简洁 ...

  8. NOIP 模拟 路径求和 - Tarjan+dfs+码

    题目大意: 各一个奇环内向森林,求每两个点对间的距离之和.无法到达则距离为-1. 分析: 首先Tarjan找出size大于1的连通分量(环),环中的边的贡献可以单独计算. 然后从入度为0的点向内dfs ...

  9. NOIP提高组初赛难题总结

    NOIP提高组初赛难题总结 注:笔者开始写本文章时noip初赛新题型还未公布,故会含有一些比较老的内容,敬请谅解. 约定: 若无特殊说明,本文中未知数均为整数 [表达式] 表示:在表达式成立时它的值为 ...

随机推荐

  1. ble示例代码

    ble代码下载: https://github.com/sutogan4ik/Android-BLE-GATT-Master-Slave

  2. Blender 脚本之 Operator 初探

    addon(插件)用来扩展 Blender 的功能,跟其他软件里的 plugin(插件)一样,去掉不会影响软件的运行.插件可以加到 Blender 的用户偏好设置目录里,或者就在你所编辑的.blend ...

  3. Laravel5路由/home页面无法访问

    报错信息: Not Found The requested URL /laravel5/public/home was not found on this server. 解决方法: 1.编辑apac ...

  4. 【leetcode】Longest Substring Without Repeating Characters

    题目描述: Given a string, find the length of the longest substring without repeating characters. For exa ...

  5. VS Code 配置Python

    1. 安装VS Code的Python插件,选择安装次数最多的那个 2. 点击用户设置菜单,在settings.json中添加 "python.pythonPath": " ...

  6. Python Web 方向(一)

    Python Web 方向(一) --------Django站点创建 文章地址:http://www.cnblogs.com/likeli/p/5821744.html Python版本:2.7 推 ...

  7. UWP学习记录5-设计和UI之控件和模式2

    UWP学习记录5-设计和UI之控件和模式2 1.应用栏和命令栏 CommandBar 控件是一款通用.灵活.轻型的控件,可显示复杂内容(如图像或文本块)以及简单的命令(如 AppBarButton.A ...

  8. 了解 Spring Data JPA

    前言 自 JPA 伴随 Java EE 5 发布以来,受到了各大厂商及开源社区的追捧,各种商用的和开源的 JPA 框架如雨后春笋般出现,为开发者提供了丰富的选择.它一改之前 EJB 2.x 中实体 B ...

  9. HashMap两种遍历方式的深入研究

    转自:http://swiftlet.net/archives/1259 HashMap的遍历有两种方式,如下所示:第一种利用entrySet的方式:   1 2 3 4 5 6 7 Map map ...

  10. response基本常识,不是很准确欢迎来纠正。

    相应客户端的回应. response.sendError(500,"抱歉你的电脑中毒了!!"); //重定向的相应码 resp.setStatus(302); //重定向的响应头 ...