【[CQOI2018]交错序列】
这个题简直有毒,\(O((a+b)^3logn)\)的做法不卡常只比\(O(2^n*n)\)多\(10\)分
看到\(a\)和\(b\)简直小的可怜,于是可以往矩阵上联想
发现这个柿子有些特殊,好像可以二项式定理搞一搞
于是\(x^ay^b\)可以写成\((n-y)^ay^b\)
于是接下来就二项式定理好了
\]
\]
发现好像可以用矩阵来维护这个\(\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\)
还是用二项式定理
\]
所以也就可以得到
\]
矩阵维护就可以了
#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]交错序列】的更多相关文章
- 【BZOJ5298】[CQOI2018]交错序列(动态规划,矩阵快速幂)
[BZOJ5298][CQOI2018]交错序列(动态规划,矩阵快速幂) 题面 BZOJ 洛谷 题解 考虑由\(x\)个\(1\)和\(y\)个\(0\)组成的合法串的个数. 显然就是把\(1\)当做 ...
- [CQOI2018]交错序列 (矩阵快速幂,数论)
[CQOI2018]交错序列 \(solution:\) 这一题出得真的很好,将原本一道矩阵快速幂硬生生加入组合数的标签,还那么没有违和感,那么让人看不出来.所以做这道题必须先知道(矩阵快速幂及如何构 ...
- BZOJ5298 CQOI2018 交错序列 【DP+矩阵快速幂优化】*
BZOJ5298 CQOI2018 交错序列 [DP+矩阵快速幂优化] Description 我们称一个仅由0.1构成的序列为"交错序列",当且仅当序列中没有相邻的1(可以有相邻 ...
- [CQOI2018]交错序列
嘟嘟嘟 要是求交错序列的个数和就好了,那我一秒就能切. 换成这个,我就不会了. 我一直想枚举1的个数,然后算出在长度为\(n\)的序列里,有多少个合法的序列,然后又觉得这好像是什么插板法,但是每一个盒 ...
- bzoj 5298: [Cqoi2018]交错序列
Description 我们称一个仅由0.1构成的序列为"交错序列",当且仅当序列中没有相邻的1(可以有相邻的0).例如,000,001 ,101,都是交错序列,而110则不是.对 ...
- BZOJ5298 [CQOI2018] 交错序列 | 矩阵乘法和一个trick
题面 求所有长度为\(n\)的.没有相邻的1的01序列中,若0有\(x\)个.1有\(y\)个,\(x^ay^b\)之和(对\(m\)取模). \(n \le 10^7, m \le 10^8, 0 ...
- BZOJ5298 CQOI2018交错序列(动态规划+矩阵快速幂)
显然答案为Σkb·(n-k)a·C(n-k+1,k).并且可以发现ΣC(n-k,k)=fibn.但这实际上没有任何卵用. 纯组合看起来不太行得通,换个思路,考虑一个显然的dp,即设f[i][j][0/ ...
- [BZOJ5298][CQOI2018]交错序列(DP+矩阵乘法)
https://blog.csdn.net/dream_maker_yk/article/details/80377490 斯特林数有时并没有用. #include<cstdio> #in ...
- cqoi2018
题解: 很多模板题 第一次写莫队还比较顺利 除了把排序的cmp写错..(还第一次遇到) 这题分块也可以 先预处理出g[i][j]代表前i个块,颜色为j的有多少种 f[i][j]表示i-j的块能构成多少 ...
随机推荐
- Java学习--java中的集合框架、Collection接口、list接口
与数组相比:1.数组的长度固定,而集合的长度可变2.数组只能通过下表访问元素,类型固定,而有的集合可以通过任意类型查找所映射的具体对象 java集合框架:collection(list序列,queue ...
- 设计模式之——外观or门面模式
1.概念 定义一个高层的统一的外观接口类,该接口用于客户端调用,和一个实现类用来包装子系统中多个类,客户端可以通过客户端完成对子系统的方法调用. 2.适用场景 2.1 代码移植,降低了现有系统的复杂度 ...
- win下环境变量的设置
Windows 和 linux 区别 一.查看所有环境变量的名称和值: Linux下:export Windows下:set 二.根据名称查该环境变量的值: Linux下:echo $环境变量名 比如 ...
- 基于springMVC实现登录过滤器
此文章是基于 搭建Jquery+SpringMVC+Spring+Hibernate+MySQL平台 一. 相关文件介绍 1. LoginFilter.java:登录过滤器,保证每次的url访问都对s ...
- 在弹框中获取foreach中遍历的id值,并传递给地址栏(方法2)
1.php有时候我们需要再弹框中获取foreach中遍历的数据(例如id),在弹框中点击按钮并传递给地址栏跳转.那么应该怎么做呢.第二种方法. 2. 可以在弹框中给出一个input hidden 点击 ...
- css的一些基础(一)
定位 定位相关属性用于设置目标组件的位置,常用的定位相关属性如下. 属性 说明 值 position 设置定位方法 static.relative.absolute.fixed left ri ...
- web 开发人员必须学习的 3 门语言
web 开发人员必须学习的 3 门语言:html css js HTML 定义了网页的内容 CSS 描述了网页的布局 JavaScript 网页的行为
- 判断当前浏览器是否支持HTML5的日期控件
function checkSupportH5Date(){ var i = document.createElement("input"); i.setAttribute(&qu ...
- jQuery 滚动条滚动
1.将div的滚动条滚动到最底端 <div class="container"></div> var $container=$(".contain ...
- Maven-pom-configuration
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...