洛谷P4456 交错序列[CQOI2018] dp+数论
正解:dp
解题报告:
传送门
首先可以先拆下这个贡献式,为了方便之后设状态什么的,把式子转成和ny有关,就成了
\(\sum \left ( n-i \right )^{a}\cdot i^{b}\)
然后拆下式子化简下,就可以得到
\(\sum \binom{a}{i}\cdot n^{i}\cdot \left ( -1 \right )^{a-i}\cdot y^{a+b-i}\)
所以现在就只要能预处理出\(y^{a+b-i}\)就能\(O\left ( n \right )\)得求出来辣!
所以考虑设dp式\(f[i][j]\)填到了第\(i\)位的时候特征值的\(j\)次方的贡献
\(umm\)感觉表示得不太清,,,再瞎解释下这个所谓的"特征值的\(j\)次方的贡献",其实指的就这个\(y^{a+b-i}\),然后此处的\(j\)指的就\(a+b-i\)
然后因为j不能相邻所以考虑加一维\([0/1]:\)最后一位是\(0\)还是\(1\)
然后转移的话就直接枚第i位填\(01\)就欧克鸭,写下转移式趴QwQ
\(f[i][j][0]=f[i-1][j][0]+f[i-1][j][1]\)
\(f[i][j][1]=∑\binom{j}{k}\cdot f[i-1][k][0]\)
关于\(1\)这个,瞎解释下趴,就,拆下式子嘛,因为填1就相当于\(y^{j}\)成了\(y^{j+1}\)
拆一下做个差得贡献为\(\sum \binom{i}{j}\cdot y^{j-i}\)
矩阵加速就好,,,随便讲下矩阵怎么构造的趴,,,
首先显然想到把矩阵分成两块儿嘛,就直接上半边全放\(f[i][j][0]\)下半边\(f[i][j][1]\)行趴
然后因为\(f[i][j][0]=f[i-1][j][0]+f[i-1][j][1]\),\(so\)转移矩阵就会是大概这样儿:
\begin{bmatrix}\ 1\ 0\ 0\ ...\ ...\ 1\ 0\ 0\ ...\ ...\end{bmatrix}
那对于\(f[i][j][1]=∑\binom{j}{k}\cdot f[i-1][k][0]\),也不难想到转移矩阵大概就这样儿的:
\begin{bmatrix}\ \binom{i}{0}\ \binom{i}{1}\ \binom{i}{2}\ \binom{i}{3}\ ...\ \binom{i}{i}\ 0\ 0\ ...\ ...\end{bmatrix}
综上,这题就做完辣\(QwQ\)(,,,这可能是我写过的最久的一篇博客辽,,,\(markdown\)虽然真滴很好看但也真滴很耗时间啊,,,\(awsl\),,,\(QAQ\)
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define ri register int
#define rc register char
#define rb register bool
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i)
const int N=200+10,M=50+10;
int n,a,b,mod,C[N][N],poww[N],as,m;
struct matrix
{
int s[N][N];
void clear(){memset(s,0,sizeof(s));}
void pre(){clear();rp(i,0,m-1)s[i][i]=1;}
int *operator[](int x){return s[x];}
}G;
il int read()
{
rc ch=gc;ri x=0;rb y=1;
while(ch!='-' && (ch>'9' || ch<'0'))ch=gc;
if(ch=='-')ch=gc,y=0;
while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),ch=gc;
return y?x:-x;
}
il int ad(ri x,ri y){x+=y;if(x>=mod)x-=mod;return x;}
il int power(ri x,ri y){ri ret=1;while(y){if(y&1)ret=1ll*ret*x%mod;x=1ll*x*x%mod;y>>=1;}return ret;}
il void pre(ri d)
{
rp(i,0,d)C[i][0]=1;
rp(i,1,d)
rp(j,1,i)C[i][j]=ad(C[i-1][j],C[i-1][j-1]);
poww[0]=1;
rp(i,1,d)poww[i]=1ll*poww[i-1]*n%mod;
}
matrix operator*(matrix &a,matrix &b)
{
matrix ret;ret.clear();
rp(i,0,m-1)
rp(k,0,m-1)
if(a[i][k])
rp(j,0,m-1)
ret[i][j]=ad(ret[i][j],1ll*a[i][k]*b[k][j]%mod);
return ret;
}
matrix m_power(matrix x,ri y)
{
matrix ret;ret.clear();ret[0][0]=1;
while(y){if(y&1)ret=ret*x;x=x*x;y>>=1;}
return ret;
}
int main()
{
n=read();a=read();b=read();mod=read();ri l=a+b+1;m=l<<1;pre(a+b+1);
rp(i,0,a+b)
{
G[i+l][i]=G[i][i]=1;
rp(j,0,i)G[j][i+l]=C[i][j];
}
matrix A=m_power(G,n);
for(ri i=0,d=(a&1)?mod-1:1;i<=a;++i,d=mod-d)
as=ad(as,1ll*C[a][i]*d%mod*(A[0][a+b-i]+A[0][a+b-i+l])%mod*poww[i]%mod);
printf("%d\n",as);
return 0;
}
啊对了这题有点卡常,,,所以说说卡常小技巧趴,,,\(QAQ\)
\(eg:\)求组合数\(C\)
这个地方是真的挺坑,,,就应该挺多人求\(C\)会是预处理一个阶乘一个逆元那样子?
但是这儿有个问题,就这样处理的时候要%很多次,,,\(so\)速度会比较卡,,,所以检验预处理\(C\),这道题是开得下的\(QwQ\)
\(umm\)其实我就优化了这儿,,,也别的卡常了就只写下这个趴\(QAQ\)
洛谷P4456 交错序列[CQOI2018] dp+数论的更多相关文章
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- NOIP2017提高组Day2T2 宝藏 洛谷P3959 状压dp
原文链接https://www.cnblogs.com/zhouzhendong/p/9261079.html 题目传送门 - 洛谷P3959 题目传送门 - Vijos P2032 题意 给定一个 ...
- 洛谷P1244 青蛙过河 DP/思路
又是一道奇奇怪怪的DP(其实是思路题). 原文戳>>https://www.luogu.org/problem/show?pid=1244<< 这题的意思给的挺模糊,需要一定的 ...
- 洛谷P3928 Sequence2(dp,线段树)
题目链接: 洛谷 题目大意在描述底下有.此处不赘述. 明显是个类似于LIS的dp. 令 $dp[i][j]$ 表示: $j=1$ 时表示已经处理了 $i$ 个数,上一个选的数来自序列 $A[0]$ 的 ...
- 洛谷P1140 相似基因 (DP)
洛谷P1140 相似基因 题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了44种核苷酸,简记作A,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. ...
- 洛谷P2224 [HNOI2001] 产品加工 [DP补完计划,背包]
题目传送门 产品加工 题目描述 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时 ...
- 洛谷1417 烹调方案 dp 贪心
洛谷 1417 dp 传送门 挺有趣的一道dp题目,看上去接近于0/1背包,但是考虑到取每个点时间不同会对最后结果产生影响,因此需要进行预处理 对于物品x和物品y,当时间为p时,先加x后加y的收益为 ...
- 洛谷1387 二维dp 不是特别简略的题解 智商题
洛谷1387 dp题目,刚开始写的时候使用了前缀和加搜索,复杂度大概在O(n ^ 3)级别,感觉这么写还是比较对得起普及/提高-的难度的..后来看了题解区各位大神的题解,开始一脸mb,之后备受启发. ...
- 洛谷 P2657 (数位DP)
### 洛谷 P2657 题目链接 ### 题目大意:给你一个数的范围 [A,B] ,问你这段区间内,有几个数满足如下条件: 1.两个相邻数位上的数的差值至少为 2 . 2.不包含前导零. 很简单的数 ...
随机推荐
- 【python】md5加密方法相关使用
md5方法在hashlib库中,使用前需要先导入.它的主要方法为update,copy,以及转换为二进制,十六进制. 用法说明: Help on HASH object: class HASH(bui ...
- WPF 10天修炼 第一天- 入门
简介 WPF技术基于DirectX,完美的整合了矢量图形.2D或3D绘图技术.文件及多媒体技术.WPF将开发人员和设计人员的职责清楚的分离,提供了一种声明编程语言XAML.同时Expression B ...
- 大一上c语言学习总结
一: 近期C语言知识点易错点整理(1)main()----在c语言中称之为“主函数”,一个c程序有且仅有一个main函数,任何一个c程序总是从main函数开始执行,main函数后面的一对圆括号不能省略 ...
- 14.并发与异步 - 3.C#5.0的异步函数 -《果壳中的c#》
14.5.2 编写异步函数 private static readonly Stopwatch Watch = new Stopwatch(); static void Main(string[] a ...
- Fiddler 抓包设置
手机抓包设置 一:配置Fiddler参数 打开Fiddler菜单项Tools->TelerikFiddler Options->HTTPS, 勾选CaptureHTTPS CONNECTs ...
- Redis 数据结构之dict(2)
本文及后续文章,Redis版本均是v3.2.8 上篇文章<Redis 数据结构之dict>,我们对dict的结构有了大致的印象.此篇文章对dict是如何维护数据结构的做个详细的理解. 老规 ...
- IMCASH:看着朋友赚钱进币圈 我凭啥亏钱? 4月29日币圈报告
即将过去的四月份,币圈的行情总体是不错的,比特从4000附近最高涨到了5600以上的位置,当前也在5200左右,而成交量更是创出历史天量(4月3日,全球加密货币市场的交易量达890亿美元,创历史天量) ...
- Mapreduce的排序(全局排序、分区加排序、Combiner优化)
一.MR排序的分类 1.部分排序:MR会根据自己输出记录的KV对数据进行排序,保证输出到每一个文件内存都是经过排序的: 2.全局排序: 3.辅助排序:再第一次排序后经过分区再排序一次: 4.二次排序: ...
- leetcode刷题第一日<两数和问题>
开始就用到了c++的哈希表是真的恶心,首先学习一波基础知识 https://blog.csdn.net/u010025211/article/details/46653519 下面放下大佬的代码 cl ...
- django——用户认证组件
用户认证 auth模块 1 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1.1 .authenti ...