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. MySQL从服务配置文件

    [mysql]port=3306socket=/var/lib/mysql/mysql.sockdefault-character-set = utf8mb4 [mysqld]server-id=2l ...

  2. COGS 2334. [HZOI 2016]最小函数值

    时间限制:1 s   内存限制:128 MB [题目描述] 有n个函数,分别为F1,F2,...,Fn.定义Fi(x)=Aix2+Bix+Ci(x∈N∗).给定这些Ai.Bi和Ci,请求出所有函数的所 ...

  3. (一)SpringMVC之警告: No mapping found for HTTP request with URI

    这个警告往往是因为url路径不正确. 所以从三个地方下手: 1.springmvc-config.xml中的配置handle,看看是不是因为handle没有配置导致的. 2.如果是使用注解的方式的话, ...

  4. Block中__block实现原理

    三.Block中__block实现原理 我们继续研究一下__block实现原理. 1.普通非对象的变量 先来看看普通变量的情况. #import <Foundation/Foundation.h ...

  5. caffe layer层cpp、cu调试经验和相互关系

    对于layer层的cpp文件,你可以用LOG和printf.cout进行调试,cu文件不能使用LOG,可以使用cout,printf. 对于softmaxloss的layer层,既有cpp文件又有cu ...

  6. WINDOWS-API:取得当前用户账户名-GetUserName

    bool TFormMain::GetCurrentProcessUser(AnsiString& strUserName) { bool bRet = false; //strUserNam ...

  7. Luogu P3627 抢掠计划

    题目传送门 \(Tarjan\)缩点+SPFA最长路 #include<iostream> #include<cstdio> #include<cstring> # ...

  8. 响应式Web设计- 背景图片

    背景图片可以响应式调整大小或缩放,以下是三种不同的方式 1.如果 background-size 属性设置为 "contain", 背景图片将按比例自适应内容区域.图片保持其比例不 ...

  9. 【模拟】bzoj1686: [Usaco2005 Open]Waves 波纹

    打完模拟题来庆祝一波:):感觉最近陷入一种“口胡五分钟打题两小时”的巨坑之中…… Description Input     第1行:四个用空格隔开的整数Pj Bi,B2,R. P(1≤P≤5)表示石 ...

  10. 开启和连接mysql服务器(win10为例)

    1.windows图标右键,选择“计算机管理”: 2.展开左边的“ 服务和应用程序” 选项,点击“服务",找到 MySQL 服务器,点击左侧的 "启动",即可完成 MyS ...