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. 【题解】LOJ2462完美的集合(树DP 魔改Lucas)

    [题解]LOJ2462完美的集合(树DP 魔改Lucas) 省选模拟考这个??????????????????? 题目大意: 有一棵树,每个点有两个属性,一个是重量\(w_i\)一个是价值\(v_i\ ...

  2. 【noip】noip201503求和(市赛后公布)

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

  3. HGOI NOIP模拟4 题解

    NOIP国庆模拟赛Day5 题解 T1 马里奥 题目描述 马里奥将要参加 NOIP 了,他现在在一片大陆上,这个大陆上有着许多浮空岛,并且其中一座浮空岛上有一个传送门,马里奥想要到达传送门从而前往 N ...

  4. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  5. 「题解」NOIP模拟测试题解乱写I(29-31)

    NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...

  6. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  7. noip借教室 题解

    题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然 ...

  8. NOIP 2018 day1 题解

    今年noip的题和去年绝对是比较坑的题了,但是打好的话就算是普通水准也能350分以上吧. t1: 很显然这是一个简单的dp即可. #include<iostream> #include&l ...

  9. Noip 2016 Day1 题解

    老师让我们刷历年真题, 然后漫不经心的说了一句:“你们就先做做noip2016 day1 吧” ...... 我还能说什么,,,,,老师你这是明摆着伤害我们啊2333333333 预计分数:100+2 ...

随机推荐

  1. Linux SSH无密码login

    一:ssh原理图为: 1.就是为了让两个linux机器之间使用ssh不需要用户名和密码.采用了数字签名RSA或者DSA来完成这个操作 2.模型分析 假设 A (192.168.20.59)为客户机器, ...

  2. vijos 1164 曹冲养猪

    描述 自从曹冲搞定了大象以后,曹操就开始捉摸让儿子干些事业,于是派他到中原养猪场养猪,可是曹冲满不高兴,于是在工作中马马虎虎,有一次曹操想知道母猪的数量,于是曹冲想狠狠耍曹操一把.举个例子,假如有16 ...

  3. 关于java中实现在oracle数据库中实现对中文首字母进行排序的解决方案

    首先介绍Oracle 9i新增加的一个系统自带的排序函数 1.按首字母排序 在oracle9i中新增了按照拼音.部首.笔画排序功能.设置NLS_SORT值     SCHINESE_RADICAL_M ...

  4. pseudogene|鉴定功能基因|expressed se|quence tag

    基因 (鉴定DNA:可以直接利用DNA序列鉴别基因,但存在3个问题) 1.intron太长(使用用来连接的算法不可及) 2.因为通常功能基因的第一个oxen中有非编码区和启动子最后一个oxen中有终止 ...

  5. java常考小程序

    private static void nineNineMulitTable(){ /** * 9*9乘法表 */ for (int i = 1,j = 1; j <= 9; i++) { Sy ...

  6. 洛谷 P2668 斗地主

    毒瘤题目,搞了三天-- 也没什么好讲的,就是纯搜索,先搜顺子,再搜其他的,最后单张牌和对子的时候,就不要搜索了,直接枚举,不然会T飞掉多么痛的领悟-- 主要还是靠码力 #include<iost ...

  7. Greenplum介绍-table

    GP中的table和其它关系型数据表是一样的,除了数据被分布在不同的segment以外. 建表时需定义以下几个方面:1. 指定列和数据类型2. 约束3. 分布策略4. 数据存储方式5. 大表分区策略 ...

  8. php登录加密加盐

    1         背景 涉及身份验证的系统都需要存储用户的认证信息,常用的用户认证方式主要为用户名和密码的方式,为了安全起见,用户输入的密码需要保存为密文形式,可采用已公开的不可逆的hash加密算法 ...

  9. Python Third Day-文件处理

    文件处理 打开文件,得到文件句柄并赋值给一个变量f=open('a.txt','r',encoding='utf-8')#默认打开的方式为r指的是文本文件,全名为‘rt’#w文件方式指的是如果有a.t ...

  10. Python发行版(编译器)

    一.Python编译器简介 根据实现Python编译器语言一般分为以下几种: 1.1.CPython 标准的Python,解释型编译器. Python:标准的CPython版本,即官方发布版本. IP ...