[洛谷P3228] [HNOI2013]数列
洛谷题目链接:[HNOI2013]数列
题目描述
小T最近在学着买股票,他得到内部消息:F公司的股票将会疯涨。股票每天的价格已知是正整数,并且由于客观上的原因,最多只能为N。在疯涨的K天中小T观察到:除第一天外每天的股价都比前一天高,且高出的价格(即当天的股价与前一天的股价之差)不会超过M,M为正整数。并且这些参数满足M(K-1)<N。小T忘记了这K天每天的具体股价了,他现在想知道这K天的股价有多少种可能
输入输出格式
输入格式:
只有一行用空格隔开的四个数:N、K、M、P。对P的说明参见后面”输出格式“中对P的解释。输入保证20%的数据M,N,K,P<=20000,保证100%的数据\(M,K,P<=10^9\) ,\(N<=10^{18}\) 。
输出格式:
仅包含一个数,表示这K天的股价的可能种数对于P的模值。【输入输出样例】
输入输出样例
输入样例#1:
7 3 2 997
输出样例#1:
16
【样例解释】
输出样例的16表示输入样例的股价有16种可能:
{1,2,3},{1,2,4},{1,3,4},{1,3,5}, {2,3,4},{2,3,5},{2,4,5},{2,4,6}, {3,4,5},{3,4,6},{3,5,6},{3,5,7},{4,5,6},{4,5,7},{4,6,7},{5,6,7}
(个人感觉这题比较神奇,是一道组合的好题)
题解: 直接考虑这个数列是比较麻烦的,但是题目给出了股票价值增长的范围,也就是说,我们可以针对每天股票的值讨论.我们设\(a_i\)表示第\(i\)天与第\(i+1\)天的价值变化,则任意\(a_i\)满足\(a_i\in[1,m]\).
答案可以表示为\(\sum_{所有合法的a数列}(n-\sum_{i=1}^{k-1}a_i)\),也就是说对应某种增长情况的数列有\(n-\sum_{i=1}^{k-1}a_i\)个.并且,题目保证\(m(k-1)<n\),也就是说,$$ans=m{k-1}*(n-\sum_{i=1}{k-1}a_i)$$.
拆一下式子,则有$$ans=m{k-1}*n-m{k-1}\sum_{i=1}^{k-1}a_i$$
再又因为在全排列中所有数字的出现次数都是相同的,也就是说\(1\)~\(m\)这\(m\)个数字总共出现了\(m^{k-1}*(k-1)\)次(因为\(a\)数列的长度是\(k-1\)),平均每个数字出现\(m^{k-2}*(k-1)\)次.也就是我们可以将式子写成这样的形式:$$ans=m{k-1}*n-m{k-2}(k-1)\sum_{i=1}^mi$$.
式子后面半部分套等差数列求和公式:$$ans=m{k-1}*n-m{k-2}(k-1)\frac{m(m-1)}{2}$$.然后就可以快速幂直接求了.
这里有个坑点,就是\(n\)的值乘一个\(int\)范围的值可能会爆\(long \ long\),需要在输入之后就先取一次模.
#include<bits/stdc++.h>
using namespace std;
typedef int _int;
#define int long long
int n, m, k, mod;
int qpow(int x, int n){
int res = 1;
for(; n; x = x*x%mod, n >>= 1)
if(n & 1) (res *= x) %= mod;
return res;
}
_int main(){
cin >> n >> k >> m >> mod; n %= mod;
cout << (qpow(m, k-1)*n%mod-qpow(m, k-2)*((m*(m+1)/2ll)%mod)%mod*(k-1)%mod+mod)%mod << endl;
return 0;
}
[洛谷P3228] [HNOI2013]数列的更多相关文章
- 【洛谷 P1667】 数列 (贪心)
题目链接 对于一个区间\([x,y]\),设这个区间的总和为\(S\) 那么我们在前缀和(设为\(sum[i]\))的意义上考虑到原操作其实就是\(sum[x−1]+=S\) , \(sum[x]+S ...
- 洛谷P1415 拆分数列[序列DP 状态 打印]
题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输出使得最后一个数最小的同时 ...
- 洛谷P1415 拆分数列(dp)
题目链接:传送门 题目: 题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输 ...
- 洛谷P1415 拆分数列
题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输出使得最后一个数最小的同时 ...
- 洛谷 P1415 拆分数列 解题报告
拆分数列 题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数. 如果有多组解,则输出使得最后一个 ...
- 洛谷 P2609 [ZJOI2012]数列 解题报告
P2609 [ZJOI2012]数列 题目描述 小白和小蓝在一起上数学课,下课后老师留了一道作业,求下面这个数列的通项公式: A(0)=0 A(1)=1 A(2i)=A(i) (对于任意 i>0 ...
- 洛谷 P2401 不等数列 题解
每日一题 day25 打卡 Analysis dp[i][j]=dp[i-1][j-1]*(i-j)+dp[i-1][j]*(j+1); 其中i和j是表示前i个数中有j个小于号,j<=i-1 要 ...
- 洛谷 P2401 不等数列
其实有两种方法来解这道题# 第一种:找规律(非正经) 一看,这玩意像是个杨辉三角,还左右对称呢 因为新插入一个数$n$,有$n+1$个位置可以选,所以总数就乘$n+1$,对应的$f[n+1][i]$也 ...
- 洛谷P4063 [JXOI2017]数列(dp)
题意 题目链接 Sol 这题想还是不难想的,就是写起来很麻烦,然后去看了一下loj的最短代码表示只能Orz 首先不难发现一条性质:能够选择的区间一定是不断收缩的,而且新的可选区间一定是旧区间的某个位置 ...
随机推荐
- struts2--文件上传大小
Struts2文件上传的大小限制问题 问题:上传大文件报错-- 解决:修改struts.xml文件中的参数如下 <constant name="struts.multipart.max ...
- Spark Transformations介绍
背景 本文介绍是基于Spark 1.3源码 如何创建RDD? RDD可以从普通数组创建出来,也可以从文件系统或者HDFS中的文件创建出来. 举例:从普通数组创建RDD,里面包含了1到9这9个数字,它们 ...
- 1029C语言文法的理解
<程序>→<外部声明>|<程序><外部声明> <外部声明>→<函数定义>|<声明> <函数定义>→< ...
- div跟随鼠标移动
1.目标是实现div跟随鼠标而移动,分三种情况进行实现 a)首先获取div,进行绑定鼠标移动事件,给div开启定位功能 第一种实现方式,假如body的大小跟页面大小一样,则可以用这个方法. 1)获取鼠 ...
- 第182天:HTML5——地理定位
HTML5 Geolocation(地理定位) HTML5 Geolocation API 用于获得用户的地理位置. 鉴于该特性可能侵犯用户的隐私,除非用户同意,否则用户位置信息是不可用的. 浏览器支 ...
- Ubuntu下搭建FTP服务器图解
在Linux中ftp服务器的全名叫 vsftpd,我们需要利用相关命令来开启安装ftp服务器,然后再在vsftpd.conf中进行相关配置,下面我来介绍在Ubuntu中vsftpd安装与配置增加用户的 ...
- 【刷题】洛谷 P3676 小清新数据结构题
题目背景 本题时限2s,内存限制256M 题目描述 在很久很久以前,有一棵n个点的树,每个点有一个点权. 现在有q次操作,每次操作是修改一个点的点权或指定一个点,询问以这个点为根时每棵子树点权和的平方 ...
- 【BZOJ2115】Xor(线性基)
[BZOJ2115]Xor(线性基) 题面 BZOJ Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si ...
- 解题:JLOI 2016 侦查守卫
题面 经典的$cov-unc$树形dp(这词是你自己造的吧=.=) 设$cov[i][j]$表示覆盖完$i$的子树后至少向外再覆盖$j$层的最小代价,$unc[i][j]$表示$i$的子树中还剩下至少 ...
- [CEOI2004]锯木厂选址
link 试题分析 做这种题就应该去先写个暴力代码 #include<iostream> #include<cstring> #include<cstdio> #i ...