这个题简直有毒,\(O((a+b)^3logn)\)的做法不卡常只比\(O(2^n*n)\)多\(10\)分

看到\(a\)和\(b\)简直小的可怜,于是可以往矩阵上联想

发现这个柿子有些特殊,好像可以二项式定理搞一搞

于是\(x^ay^b\)可以写成\((n-y)^ay^b\)

于是接下来就二项式定理好了

\[(n-y)^ay^b=\sum_{r=0}^a\binom{a}{r}n^{a-r}*(-y)^r*y^b
\]

\[=\sum_{r=0}^a\binom{a}{r}n^{a-r}*(-1)^r*y^{b+r}
\]

发现好像可以用矩阵来维护这个\(\sum\)的每一项

先列一下\(dp\)的方程,设\(dp[i][j][0/1]\)表示进行到第\(i\)位上,这个\(\sum\)的第\(j\)次方项,最后一位填的是\(0/1\)

如果这一位填\(0\),对答案并没有什么贡献,但是前面填\(0/1\)都是可以的,于是\(dp[i][j][0]=dp[i-1][j][0]+dp[i-1][j][1]\)

如果这一位填的是\(1\),那么前面的那一位只能填\(0\),\(y\)增加了\(1\),所以答案变成了\((y+1)^j\)

还是用二项式定理

\[(y+1)^j=\sum_{k=0}^j\binom{j}{k}y^k
\]

所以也就可以得到

\[dp[i][j][1]=\sum_{k=0}^j\binom{j}{k}*dp[i-1][k][0]
\]

矩阵维护就可以了

#include<iostream>
#include<cstring>
#include<cstdio>
#define re register
#define maxn 185
#define LL long long
LL a[maxn][maxn],ans[maxn][maxn];
int sz;
int T,A,b,P;
LL c[maxn][maxn];
inline void did_a()
{
LL mid[maxn][maxn];
for(re int i=1;i<=sz;i++)
for(re int j=1;j<=sz;j++)
mid[i][j]=a[i][j],a[i][j]=0;
for(re int i=1;i<=sz;i++)
for(re int k=1;k<=sz;k++)
for(re int j=1;j<=sz;j++)
{
a[i][j]+=mid[i][k]*mid[k][j];
if(a[i][j]>P) a[i][j]%=P;
}
}
inline void did_ans()
{
LL mid[maxn][maxn];
for(re int i=1;i<=sz;i++)
for(re int j=1;j<=sz;j++)
mid[i][j]=ans[i][j],ans[i][j]=0;
for(re int i=1;i<=sz;i++)
for(re int k=1;k<=sz;k++)
for(re int j=1;j<=sz;j++)
{
ans[i][j]+=mid[i][k]*a[k][j];
if(ans[i][j]>P) ans[i][j]%=P;
}
}
inline LL quick(LL a,int b)
{
LL S=1;
while(b)
{
if(b&1) S=S*a%P;
b>>=1;
a=a*a%P;
}
return S;
}
inline void Mat_quick(int b)
{
while(b)
{
if(b&1) did_ans();
b>>=1;
did_a();
}
}
int main()
{
scanf("%d%d%d%d",&T,&A,&b,&P);
c[0][0]=1;
for(re int i=1;i<=A+b;i++) c[i][0]=c[i][i]=1;
for(re int i=1;i<=A+b;i++)
for(re int j=1;j<i;j++)
c[i][j]=(c[i-1][j-1]+c[i-1][j])%P;
sz=(A+b+1)*2;
for(re int i=1;i<=sz;i++)
ans[i][i]=1;
for(re int i=1;i<=(sz>>1);i++)
a[i][i]=a[i+sz/2][i]=1;
for(re int i=1;i<=(sz>>1);i++)
for(re int j=i+sz/2;j<=sz;j++)
a[i][j]=c[j-1-sz/2][i-1];
Mat_quick(T);
LL Ans=0;
for(re int i=0;i<=A;i++)
if(i&1) Ans=(Ans-c[A][i]*quick(T,A-i)%P*(ans[1][i+1+b]+ans[1][i+1+b+sz/2]%P)%P+P)%P;
else Ans=(Ans+c[A][i]*quick(T,A-i)%P*(ans[1][i+1+b]+ans[1][i+1+b+sz/2]%P))%P;
std::cout<<Ans;
return 0;
}

【[CQOI2018]交错序列】的更多相关文章

  1. 【BZOJ5298】[CQOI2018]交错序列(动态规划,矩阵快速幂)

    [BZOJ5298][CQOI2018]交错序列(动态规划,矩阵快速幂) 题面 BZOJ 洛谷 题解 考虑由\(x\)个\(1\)和\(y\)个\(0\)组成的合法串的个数. 显然就是把\(1\)当做 ...

  2. [CQOI2018]交错序列 (矩阵快速幂,数论)

    [CQOI2018]交错序列 \(solution:\) 这一题出得真的很好,将原本一道矩阵快速幂硬生生加入组合数的标签,还那么没有违和感,那么让人看不出来.所以做这道题必须先知道(矩阵快速幂及如何构 ...

  3. BZOJ5298 CQOI2018 交错序列 【DP+矩阵快速幂优化】*

    BZOJ5298 CQOI2018 交错序列 [DP+矩阵快速幂优化] Description 我们称一个仅由0.1构成的序列为"交错序列",当且仅当序列中没有相邻的1(可以有相邻 ...

  4. [CQOI2018]交错序列

    嘟嘟嘟 要是求交错序列的个数和就好了,那我一秒就能切. 换成这个,我就不会了. 我一直想枚举1的个数,然后算出在长度为\(n\)的序列里,有多少个合法的序列,然后又觉得这好像是什么插板法,但是每一个盒 ...

  5. bzoj 5298: [Cqoi2018]交错序列

    Description 我们称一个仅由0.1构成的序列为"交错序列",当且仅当序列中没有相邻的1(可以有相邻的0).例如,000,001 ,101,都是交错序列,而110则不是.对 ...

  6. BZOJ5298 [CQOI2018] 交错序列 | 矩阵乘法和一个trick

    题面 求所有长度为\(n\)的.没有相邻的1的01序列中,若0有\(x\)个.1有\(y\)个,\(x^ay^b\)之和(对\(m\)取模). \(n \le 10^7, m \le 10^8, 0 ...

  7. BZOJ5298 CQOI2018交错序列(动态规划+矩阵快速幂)

    显然答案为Σkb·(n-k)a·C(n-k+1,k).并且可以发现ΣC(n-k,k)=fibn.但这实际上没有任何卵用. 纯组合看起来不太行得通,换个思路,考虑一个显然的dp,即设f[i][j][0/ ...

  8. [BZOJ5298][CQOI2018]交错序列(DP+矩阵乘法)

    https://blog.csdn.net/dream_maker_yk/article/details/80377490 斯特林数有时并没有用. #include<cstdio> #in ...

  9. cqoi2018

    题解: 很多模板题 第一次写莫队还比较顺利 除了把排序的cmp写错..(还第一次遇到) 这题分块也可以 先预处理出g[i][j]代表前i个块,颜色为j的有多少种 f[i][j]表示i-j的块能构成多少 ...

随机推荐

  1. DIRECTORY_SEPARATOR 目录分隔符 php内置变量

    转自http://www.cnblogs.com/timelesszhuang/p/3814878.html 在windows我们习惯性的使用“\”作为文件分隔符,但是在linux上系统不认识这个标识 ...

  2. Android中自定义弹出PopupWindow后返回按键失效的问题解决

    PopupWindow出现之后,默认的是所有的操作都无效的,除了HOME键.而且是可以操作后面的界面的.想要锁定后面的界面,很简单,只需要让PopupWindow是focusable的:popupWi ...

  3. poj 1088(DP+递归)

    这题状态方程很容易得到:DP[i][j] = max(DP[i-1][j],DP[i+1][j],DP[i][j-1],DP[i][j+1]) + 1 难点在于边界条件和剪枝,因为这方程的条件是点在m ...

  4. eclipse 查看源码 source not found

    是因为eclipse里面没有设置好源码路径. 源码路径在jdk安装包里面 C:/Program Files/Java/jdk1.8.0_191/src.zip  这个src.zip文件, 设置ecli ...

  5. H5 Js图片转base64编码

    <!Doctype html> <html> <head> <meta charset="utf-8" /> <title&g ...

  6. Java数据库操作(JDBC)

    JDBC Java数据库连接(Java DataBase Connectivity,JDBC)用于在Java程序中实现数据库操作功能,它提供了执行SQL语句.访问各种数据库的方法,并为各种不同的数据库 ...

  7. Drupal网站报错:PDOException: in lock_may_be_available()

    Drupal网站报错: 原因: windows中mysql的服务停止了: 解决办法: 在服务中,启动mysql服务 启动后,刷新页面,问题完美解决

  8. path-to-regexp快速拆分 url 路径中的参数信息

    介绍一个小工具 path-to-regexp 用于快速拆解url path中的部分,贴别适合restful接口中快速获取对应的实体参数 git地址可以参考 https://github.com/pil ...

  9. How To Manage StartUp Applications In Ubuntu

    Ever felt the need to control startup applications in Ubuntu? You should, if you feel that your Ubun ...

  10. 微信小程序开发11-HTTPS网络通信(重点)

    1.OneNET平台支持https,将HTTP头部改成https://api.heclouds.com即可(重点!!!!!!!!) 2.如果我们需要从 https://test.com/getinfo ...