[HNOI2013]数列(差分)
[HNOI2013]数列
problem
洛谷链接
solution
假设每天的股价为 a[i]a[i]a[i]。则需满足 ∀i<ka[i+1]−a[i]≤m\forall_{i<k}a[i+1]-a[i]\le m∀i<ka[i+1]−a[i]≤m。又有参数满足 m(k−1)<nm(k-1)<nm(k−1)<n。
也就是说每天的股价都可以取到上限,即 ∀i<ka[i+1]−a[i]=m\forall_{i<k}a[i+1]-a[i]=m∀i<ka[i+1]−a[i]=m。
当然都要保证 a[k]≤na[k]\le na[k]≤n。
这种每天都有增长求方案数的题目,容易联想到差分。因为当差分数组确定时,就只与第一个元素的值有关了。
用差分刻画数组 是很经典的套路。
令 ∀i<ks[i]=a[i+1]−a[i]\forall_{i<k}s[i]=a[i+1]-a[i]∀i<ks[i]=a[i+1]−a[i]。
一个差分数组贡献都是 111。但是有若干种股价方案的差分数组是同一个,就可以合并计算。
这里可以采用对第一天股价的起始值刻画出差分的增值一样但本质不同的股价方案。
显然,方案数为 n−∑i=1k−1s[i]n-\sum_{i=1}^{k-1}s[i]n−∑i=1k−1s[i]。因为在 a[1]∈[1,n−∑i=1k−1s[i]]a[1]\in[1,n-\sum_{i=1}^{k-1}s[i]]a[1]∈[1,n−∑i=1k−1s[i]] 的时候,都有 a[k]≤na[k]\le na[k]≤n。
而本质不同的差分数列的个数又为 mk−1m^{k-1}mk−1,前面说过任何一天的增值都有可能取到 mmm。
综上可以得出答案的式子:∑j=1mk−1(n−∑i=1k−1sj[i])=nmk−1−∑j=1mk−1∑i=1k−1sj[i]\sum_{j=1}^{m^{k-1}}(n-\sum_{i=1}^{k-1}s_j[i])=nm^{k-1}-\sum_{j=1}^{m^{k-1}}\sum_{i=1}^{k-1}s_j[i]∑j=1mk−1(n−∑i=1k−1sj[i])=nmk−1−∑j=1mk−1∑i=1k−1sj[i]。
显然 sss 是将所有可能的合法差分数列都计算到了。并且有 sj[i]∈[1,m]s_j[i]\in[1,m]sj[i]∈[1,m]。
先不管差分数值,那么后面一共就会有 mk−1(k−1)m^{k-1}(k-1)mk−1(k−1) 个数,并且在 [1,m][1,m][1,m] 是均匀分布。
所以 [1,m][1,m][1,m] 中的每个数出现次数都是一样的,即 mk−2(k−1)m^{k-2}(k-1)mk−2(k−1)。在乘上数值即可。
ans=nmk−1−∑j=1mk−1∑i=1k−1sj[i]=nmk−1−∑i=1mi∗mk−2(k−1)ans=nm^{k-1}-\sum_{j=1}^{m^{k-1}}\sum_{i=1}^{k-1}s_j[i]=nm^{k-1}-\sum_{i=1}^mi*m^{k-2}(k-1)ans=nmk−1−∑j=1mk−1∑i=1k−1sj[i]=nmk−1−∑i=1mi∗mk−2(k−1)。
后面的式子就是个等差数列求和而已。
最后化简答案:ans=nmk−1−(m+1)m2mk−2(k−1)ans=nm^{k-1}-\frac{(m+1)m}{2}m^{k-2}(k-1)ans=nmk−1−2(m+1)mmk−2(k−1)。
有的题解觉得这个除法有点坑,有的用了 exgcd
求解逆元。
根本没有这种必要啊?!
逆元是因为不能整除所以才在 ppp 域内去找有相同效果的数。
但是明显 m(m+1)m(m+1)m(m+1) 一定有一个是偶数,一定能被 222 整除。
code
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n, m, k, p;int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % p;x = x * x % p;y >>= 1;}return ans;
}signed main() {scanf( "%lld %lld %lld %lld", &n, &k, &m, &p );printf( "%lld\n", ( n % p * qkpow(m, k - 1) % p - qkpow(m, k - 2) * (k - 1) % p * (m * (m + 1) / 2 % p) % p + p ) % p );return 0;
}
[HNOI2013]数列(差分)相关推荐
- [HNOI2013]数列(牛客竞赛)
[HNOI2013]数列 题目描述: 链接: [HNOI2013]数列 来源:牛客网 小T最近在学着买股票,他得到内部消息:F公司的股票将会疯涨.股票每天的价格已知是正整数,并且由于客观上的原因,最多 ...
- [洛谷P3228] [HNOI2013]数列
洛谷题目链接:[HNOI2013]数列 题目描述 小T最近在学着买股票,他得到内部消息:F公司的股票将会疯涨.股票每天的价格已知是正整数,并且由于客观上的原因,最多只能为N.在疯涨的K天中小T观察到: ...
- 3142:[HNOI2013]数列 - BZOJ
题目描述 Description 小T最近在学着买股票,他得到内部消息:F公司的股票将会疯涨. 股票每天的价格已知是正整数,并且由于客观上的原因,最多只能为N.在疯涨的K天中小T观察到:除第一天外每天 ...
- BZOJ刷题记录---提高组难度
BZOJ刷题记录---提高组难度 总目录详见https://blog.csdn.net/mrcrack/article/details/90228694 序号 题号 算法 思想难度 实现难度 总难度 ...
- # HNOI2012 ~ HNOI2018 题解
HNOI2012 题解 [HNOI2012]永无乡 Tag:线段树合并.启发式合并 联通块合并问题. 属于\(easy\)题,直接线段树合并 或 启发式合并即可. [HNOI2012]排队 Tag:组 ...
- C mysql带参数存储过程_C# 调用Mysql 带参数存储过程
使用C#调用Mysql 带参数的存储过程: 1.创建带参数的存储过程:USP_Temp_Test 2.两个参数:IN 参数为 P_XML , OUT 参数为 P_ErrorOut 3.C#代码调用该存 ...
- 数学科学的完整课程大纲(工科自学必看)
数学科学的完整课程 第一 1. 数学分析 第1章 数学基础 第2章 数系 实数系 复数系 广义实数系 第3章 拓扑 PART A 数列 第A1章 数列 第A2章 数列差分 第A3章 数列求和 第A4章 ...
- 数学知识:和式的处理及二项式系数的运用
数学知识:和式的处理及二项式系数的运用 〇 这段时间看了一部分<具体数学>上的内容,正如第一章中所说,这本书的主要目的是: 说明不具备超人洞察力的人如何求解问题 也就是说,这本书主要讲述的 ...
- 第四章:前缀和、差分(数列)
前缀和差分 一.前缀和 1. 什么是前缀和 2. 前缀和的作用 3. 前缀和的例题和模板 (1)一维数组的前缀和 C++版 C版 (2)二维数组的前缀和 a.思路: b.题目和模板: C++版 C版 ...
最新文章
- PHP 毫秒级定时器,实现php毫秒定时器方法详解
- python装饰器实例-python装饰器实例大详解
- halcon知识:工业相机问答(更新中...)
- python3.6安装包多大_win10下Python3.6安装、配置以及pip安装包教程
- 【目录】shell 编程-xyq
- linux中的压缩命令详细解析(一)
- HTML5 学习笔记(三)——本地存储(LocalStorage、SessionStorage、Web SQL Database)
- kubernetes挂载存储
- 聊聊springcloud的GatewayControllerEndpoint
- Mysql安装步骤:
- bzoj3207 花神的嘲讽计划Ⅰ
- TFTLCD原理与驱动与指令介绍
- 云服务总线CSB:“连”无边界
- Matlab/Simulink 自动代码生成 基于模型设计学习教程(1)---- 环境配置
- 小米2s android7.0秋大,老炮儿?小米2s升级MIUI 7流畅一逼!
- 【PyTorch】torch.nn.Transformer解读与应用
- 支持web信息分类的高性能蜘蛛程序 爬虫程序 spider
- 中国人最需要的“基础文明”有三项
- 音乐剪辑/转换/软件使用方法
- flash中导入音乐和制作按钮
热门文章
- 监督学习:KNN(K-近邻)算法实现手写数字识别的三种方法
- 神经网络简史:BP算法后的又一突破—信念网络
- html引用单文件组件,vue之单文件组件 纯网页方式引入
- Java之jdk与jre的区别
- kylin如何支持flink_日均万亿条数据如何处理?爱奇艺实时计算平台这样做
- 计算机语言学考研科目,语言学考研笔记整理(共16页)
- 14考研计算机考前,计算机专业考研考前终极预测试题.docx
- python——学习笔记3
- 算法设计与分析——递归与分治策略——棋盘覆盖
- leetcode 904:水果成篮(滑动窗口)