NOIP2015普及组★求和★数学
来源:互联网 发布:趋势科技杀毒软件 知乎 编辑:程序博客网 时间:2024/05/21 19:45
- 题目
- 题目描述
- 输入
- 输出
- 输入样例1
- 输出样例1
- 输入样例2
- 输出样例2
- 提示
- 输入输出样例 1 说明
- 数据规模
- 思路
- 概述
- 推导
- 优化
- 代码
题目
题目描述
一条狭长的纸带被均匀划分出了n个格子,格子编号从1到n。每个格子上都染了一种颜色color_i用[1,m]当中的一个整数表示),并且写了一个数字number_i。
定义一种特殊的三元组:(x,y,z),其中x,y,z都代表纸带上格子的编号,这里的三元组要求满足以下几个条件:
- x,y,z是整数
- x < y < z
- y-x = z-y
- color_x=color_z
满足上述条件的三元组的分数规定为(x+z)*(number_x+number_z)。整个纸带的分数规定为所有满足条件的三元组的分数的和。这个分数可能会很大,你只要输出整个纸带的分数除以10,007所得的余数即可。
输入
第一行是用一个空格隔开的两个正整数n和m,n表示纸带上格子的个数,m表纸带上颜色的种类数。
第二行有n用空格隔开的正整数,第i数字number表示纸带上编号为i格子上面写的数字。
第三行有n用空格隔开的正整数,第i数字color表示纸带上编号为i格子染的颜色。
输出
共一行,一个整数,表示所求的纸带分数除以10,007所得的余数。
输入样例#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 + 5)*(5 + 2) + (4 + 6)*(2 + 2) = 42 + 40 = 82。
数据规模
对于第 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 ≤ color_i ≤ m,1≤number_i≤100000
思路
概述
看到这道题,我不由自主地想到了2016年的魔法阵= =
它的条件肯定是有心机的,所以一条一条地看:
- x,y,z是整数
这个没什么好说的。 - x < y < z
这个也没什么好说的。 - y-x = z-y
移项,得z+x=2y ,2y 为偶数,z+x 等于一个偶数,z 和x 又都为整数,说明x 和z 同奇同偶。 - color_x=color_z
x 和z 颜色一样。
好像并没有分析出什么,还发现y没有什么用……
但是,对于1-N所有的编号,只要这个编号满足这样的条件,都可以作为一个三元组,所以完全可以把满足上述条件的编号存在一起(暂且先存编号,接下来的推导会让你发现不需要存编号),即是把同奇偶,同颜色的存在一起。
至于y,直接扔掉。
别忘了还有传说中分数的计算方式:
(x+z)×(numberx+numberz)
把
推导
几个好像看不出什么规律,我们可以多写几个:
设
则总分数为:
拆开并化简一些得:
这是将每个2次式拆开,然后合并之前
将第1行和第4行合并得:
继续:
事实上,最后一行换一种合并方式,提
于是,2、3行便可以合并了:
发现第二行中的第
用
可能看上去十分繁琐,但是也不算太难,为了更容易看懂,我写得很详细(一中午的大好光阴,就消逝在这这些数学符号之中……)
优化
但是,储存每个
枚举编号
提一个
完了~
记得随时mod哦~
代码
#include<cstdio>int read(){ int x=0,f=1;char s=getchar(); while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();} while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();} return x*f;}#define MAXN 100000#define MAXM 100000#define MOD 10007int N,ans;int f[MAXM+5][2],n[MAXM+5][2];int Number[MAXN+5],Color[MAXN+5];int main(){ N=read(); read(); for(int i=1;i<=N;i++) Number[i]=read()%MOD; for(int i=1;i<=N;i++) { Color[i]=read(); f[Color[i]][i&1]=(f[Color[i]][i&1]+Number[i])%MOD; n[Color[i]][i&1]++; } for(int i=1;i<=N;i++) ans=(ans+(((n[Color[i]][i&1]-2)%MOD*Number[i]%MOD+f[Color[i]][i&1])%MOD)*(i%MOD)%MOD)%MOD; printf("%d",ans);}
- NOIP2015普及组★求和★数学
- [NOIP2015普及组]求和
- NOIP2015普及组 T3 求和
- NOIP2015(普及组)T3 求和
- ◆竞赛题目◆◇NOIP2015普及组◇求和
- caioj 1362 NOIP2015普及组 第三题 求和
- NOIP2015普及组总结
- Noip2015普及组
- NOIP2015普及组 金币
- NOIP2015普及组 金币
- [NOIP2015][CODEVS5131]求和(数学相关)
- noip2015广东 普及组coin
- Noip2015 普及组 推销员 题解
- NOIP2015普及组T4salesman题解
- noip2015普及组第四题
- NOIP2015普及组-扫雷游戏
- noip2015 普及组:金币 水
- 求和(NOIP2015)
- ArrayList和数组的互换
- 解决webpack 报错:'NODE_ENV' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
- servlet的生命周期和工作原理
- 凭什么说亚马逊将成为第一个突破万亿美元的科技公司?
- Extjs中Ext.data.Store的多种操作详解
- NOIP2015普及组★求和★数学
- 消息队列中间件的技术选型分析
- js判断页面是否在iframe并跳出iframe
- 2017年10月18日 第九次总结
- CERC2015 Frightful Formula 神奇的模意义下分数
- Number Theory (Easy) SPOJ
- JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解
- 值比较 跟 索引比较
- Redis官方文档(入门必备)