bzoj3142 luogu3228 HNOI2013 数列
这题好没意思啊,怀疑拉不开区分度。
题意:求一个递增序列,每两个相邻数字之间的差值不超过m,最后一个值不能大于n。
分析:网上好多人用了差分,我没想到。然后YY了一发生成函数。
考虑构造生成函数G(x) = x+x2+...+xm.
我们的目标是求这个G(k-1)(x)的很多个前缀和。
具体来说是求什么呢?
这题的重点其实在于一个注意不到的细节:(k-1)*m<n。
这意味着,当第一项为1时,所有的答案一定被满足。
也就是说,当第一项为1时,对应的答案是G(k-1)(x)的所有项数之和。
实际上通过举例子,你会发现这样一个性质:[xi+k-1]G(k-1)(x) = [x(k-1)*m-i]G(k-1)(x) 其中i的范围自己想一下。
这个性质怎么证明呢:归纳
考虑将Gi(x)除以xi,然后乘以G(x)/x,然后把除的东西乘上。由于上一个具有这样的对称性,画图之后我们发现乘的时候是对称的,那么这个性质仍然满足。
通过我们对高斯的了解,我们知道他10岁的时候想到了1加到100的方法,他非常聪明,而我们只能照葫芦画瓢。
什么意思呢,我们考虑第一项为i的时候,在某个位置的时候出现了第一个不满足的序列。
然后从后往前,在某个位置出现了第一个满足的序列。
把两个匹配在一起,这样子我们得到了一个完整的序列,即(m)^(k-1).
众所周知,高斯是个很聪明的孩子,那么他用的方法很可能是将1到100翻倍然后两两配对,最后除以2。这个方法在这不好用。
我们不容易确认2在这个模数下有逆。
取而代之的方法是用类似1配99,2配98的方法。考虑多了一项怎么办。
不难发现的是,多出来的一项一定是配出来的结果的一半,不说明了。
做这个答案的时候一定要先留下一个m,将这个m除以2再乘进去。
代码:
#include<bits/stdc++.h>
using namespace std; typedef long long ll; ll n,k,m,mod;
ll pw,maxx; ll fast_pow(int now,int p){
if(p == ) return ;
if(p == ) return now;
ll z = fast_pow(now,p/);
z *= z; z %= mod;
if(p & ) z*=now,z%=mod;
return z;
} int main(){
scanf("%lld%lld%lld%lld",&n,&k,&m,&mod);
maxx = (k-)*m;
if(k == ){printf("%lld",n);return;}
pw = fast_pow(m,k-);
ll fir = n-maxx+; // diyige youxiaci de
ll lst = n-(k-); // zuihouyige youxiacide
ll len = lst-fir+,multi = len/;
ll ans = ((multi+n-maxx)%mod)*pw; ans %= mod;
if(len & ){
pw = fast_pow(m,k-);
pw *= (m/);pw %= mod;
ans += pw;ans %= mod;\
}
printf("%lld",ans);
return ;
}
bzoj3142 luogu3228 HNOI2013 数列的更多相关文章
- 【BZOJ3142】[HNOI2013]数列(组合计数)
[BZOJ3142][HNOI2013]数列(组合计数) 题面 BZOJ 洛谷 题解 唯一考虑的就是把一段值给分配给\(k-1\)天,假设这\(k-1\)天分配好了,第\(i\)天是\(a_i\),假 ...
- 【BZOJ3142】[HNOI2013]数列
[BZOJ3142][HNOI2013]数列 题面 洛谷 bzoj 题解 设第\(i\)天的股价为\(a_i\),记差分数组\(c_i=a_{i+1}-a_i\) 则 \[ Ans=\sum_{c_1 ...
- 【bzoj3142】[Hnoi2013]数列 数学
题目描述 求满足 $1\le a_i\le n\ ,\ 1\le a_{i+1}-a_i\le m$ 的序列 $a_1...a_k$ 的个数模 $p$ 的值. 输入 只有一行用空格隔开的四个数:N.K ...
- [BZOJ3142][HNOI2013]数列(组合数学)
3142: [Hnoi2013]数列 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1721 Solved: 854[Submit][Status][ ...
- [洛谷P3228] [HNOI2013]数列
洛谷题目链接:[HNOI2013]数列 题目描述 小T最近在学着买股票,他得到内部消息:F公司的股票将会疯涨.股票每天的价格已知是正整数,并且由于客观上的原因,最多只能为N.在疯涨的K天中小T观察到: ...
- BZOJ3142 [Hnoi2013]数列
Description 小 T最近在学着买股票,他得到内部消息:F公司的股票将会疯涨.股票每天的价格已知是正整数,并且由于客观上的原因,最多只能为N.在疯涨的K天中小T观察 到:除第一天外每天的股价都 ...
- bzoj千题计划293:bzoj3142: [Hnoi2013]数列
http://www.lydsy.com/JudgeOnline/problem.php?id=3142 如果已知数列的差分数列a[1]~a[k-1] 那么这种差分方式对答案的贡献为 N-Σ a[i] ...
- BZOJ3142 HNOI2013数列(组合数学)
考虑差分序列.每个差分序列的贡献是n-差分序列的和,即枚举首项.将式子拆开即可得到n*mk-1-Σi*cnt(i),cnt(i)为i在所有差分序列中的出现次数之和.显然每一个数出现次数是相同的,所以c ...
- BZOJ3142 [Hnoi2013]数列 【组合数学】
题目链接 BZOJ3142 题解 题意:选一个正整数和\(K - 1\)个\([1,M]\)中的数,使得总和小于等于\(N\),求方案数模\(P\) 题目中\(K(M - 1) < N\)的限制 ...
随机推荐
- js创建数组的三个方式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Apache服务器安装-apache已经卸载,如何删除注册在系统的服务
cmd进入windows的命令行客户端,执行:sc delete apache 注意:以管理员的身份删除,同理,此方法也可以删除其他类似的服务.例如sc delete MongoDB.
- 关于Spring事务的原理,以及在事务内开启线程,连接池耗尽问题.
主要以结果为导向解释Spring 事务原理,连接池的消耗,以及事务内开启事务线程要注意的问题. Spring 事务原理这里不多说,网上一搜一大堆,也就是基于AOP配合ThreadLocal实现. 这里 ...
- Kaggle新手入门之路
学完了Coursera上Andrew Ng的Machine Learning后,迫不及待地想去参加一场Kaggle的比赛,却发现从理论到实践的转变实在是太困难了,在此记录学习过程. 一:安装Anaco ...
- springmvc报406错误
springmvc出现406,无非就两种情况,第一,百分之九十是json包没加进来,第二,百分之十,就是@ResponseBody返回的的数据,在请求的URL中不能有 .html的后缀
- 错误:readline/readline.h:没有那个文件或目录解决方法
curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz tar zxf lua-5.3.0.tar.gz cd lua-5.3.0 make linux ...
- javascript 学习笔记 -内部类
js的内部类 javascript内部有一些可以直接使用的类 javascript主要有以下 object Array Math boolean String D ...
- 错误代码: 1305 PROCEDURE world.insert_data does not exist
1.错误描述 1 queries executed, 0 success, 1 errors, 0 warnings 查询:call insert_data() 错误代码: 1305 PROCEDUR ...
- 安装Android的SDK
安装Android的SDK 1.首先,下载installer_r23.0.2-windows.exe 2.双击"installer_r23.0.2-windows.exe",进入A ...
- jquery.lazyload.js实现图片懒加载
个人理解:将需要延迟加载的图片的src属性全部设置为一张相同尽可能小(目的是尽可能的少占宽带,节省流量,由于缓存机制,当浏览器加载了一张图片之后,相同的图片就会在缓存中拿,不会重新到服务器上拿)的图片 ...