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

题面

BZOJ

洛谷

题解

考虑由\(x\)个\(1\)和\(y\)个\(0\)组成的合法串的个数。

显然就是把\(1\)当做隔板插入进去,那么有\(y+1\)个位置可以放\(1\),所以方案数就是\({y+1\choose x}\)。

而\(x^ay^b\)的贡献可以直接快速幂算,所以问题变成了求组合数。然后\(Lucas\)一下就可以得到\(TLE\)的好成绩了。复杂度\(O(nlogn)\)(事实上只要有快速幂就会\(T\))

那就换种做法吧。。。来\(dp\)。

把\(x^ay^b\)展开其中一个部分,即\((n-y)^ay^b\),大力展开之后变成了\(\displaystyle y^b\sum_{i=0}^a{a\choose i}(-y)^{a-i}n^{i}\)。再化简一下就是\(\displaystyle \sum_{i=0}^a{a\choose i}(-1)^{a-i}y^{a+b-i}n^i\),因此只需要对于每一个\(i\),求\(y^{a+b-i}\)的和就好了。

设\(f[i][j][0/1]\)表示现在考虑到了第\(i\)位,这一位填的数是\(0/1\)的特征值的\(j\)次方和。

那么这样子考虑在这一位上填上了一个\(1\),那么\(y^j\)变成了\((y+1)^j\),二项式定理展开+做差之后,得到的就是\((y+1)^j=\sum_{i=0}^{j} {j\choose i}y^i\)。

这样子就可以使用矩乘来进行转移,时间复杂度大概是\(O((2(a+b+1))^3log)\)。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAX 10000100
int a,b,n,N,ans,MOD,C[200][200],pw[200];
int fpow(int a,int b){int s=1;while(b){if(b&1)s=1ll*s*a%MOD;a=1ll*a*a%MOD;b>>=1;}return s;}
struct Matrix
{
int s[200][200];
void clear(){memset(s,0,sizeof(s));}
void pre(){clear();for(int i=0;i<N;++i)s[i][i]=1;}
int*operator[](int x){return s[x];}
}G;
Matrix operator*(Matrix &a,Matrix &b)
{
Matrix ret;ret.clear();
for(int i=0;i<N;++i)
for(int k=0;k<N;++k)
if(a[i][k])
for(int j=0;j<N;++j)
ret[i][j]=(ret[i][j]+1ll*a[i][k]*b[k][j])%MOD;
return ret;
}
Matrix fpow(Matrix a,int b)
{
Matrix s;s.clear();s[0][0]=1;
while(b){if(b&1)s=s*a;a=a*a;b>>=1;}
return s;
}
int main()
{
scanf("%d%d%d%d",&n,&a,&b,&MOD);
for(int i=0;i<=a+b;++i)C[i][0]=1;
for(int i=1;i<=a+b;++i)
for(int j=1;j<=i;++j)
C[i][j]=(C[i-1][j]+C[i-1][j-1])%MOD;
pw[0]=1;for(int i=1;i<=a+b;++i)pw[i]=1ll*pw[i-1]*n%MOD;
int l=a+b+1;N=l<<1;
for(int i=0;i<=a+b;++i)
{
G[i+l][i]=G[i][i]=1;
for(int j=0;j<=i;++j)G[j][i+l]=C[i][j];
}
Matrix A=fpow(G,n);
for(int i=0,d=(a&1)?MOD-1:1;i<=a;++i,d=MOD-d)
ans=(ans+1ll*C[a][i]*d%MOD*(A[0][a+b-i]+A[0][a+b-i+l])%MOD*pw[i])%MOD;
printf("%d\n",ans);
return 0;
}

【BZOJ5298】[CQOI2018]交错序列(动态规划,矩阵快速幂)的更多相关文章

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

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

  2. poj 3744 Scout (Another) YYF I - 概率与期望 - 动态规划 - 矩阵快速幂

      (Another) YYF is a couragous scout. Now he is on a dangerous mission which is to penetrate into th ...

  3. hdu 2604 Queuing(动态规划—>矩阵快速幂,更通用的模版)

    题目 最早不会写,看了网上的分析,然后终于想明白了矩阵是怎么出来的了,哈哈哈哈. 因为边上的项目排列顺序不一样,所以写出来的矩阵形式也可能不一样,但是都是可以的 //愚钝的我不会写这题,然后百度了,照 ...

  4. Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...

  5. BZOJ2553 Beijing2011禁忌(AC自动机+动态规划+矩阵快速幂+概率期望)

    考虑对一个串如何分割能取得最大值.那么这是一个经典的线段覆盖问题,显然每次取右端点尽量靠前的串.于是可以把串放在AC自动机上跑,找到一个合法串后就记录并跳到根. 然后考虑dp.设f[i][j]表示前i ...

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

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

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

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

  8. BZOJ4887 Tjoi2017可乐(动态规划+矩阵快速幂)

    设f[i][j]为第i天到达j号城市的方案数,转移显然,答案即为每天在每个点的方案数之和.矩乘一发即可. #include<iostream> #include<cstdio> ...

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

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

随机推荐

  1. 软工网络15团队作业4——Alpha阶段敏捷冲刺

    Deadline: 2018-4-29 10:00PM,以提交至班级博客时间为准. 根据以下要求,团队在日期区间[4.16,4.29]内,任选8天进行冲刺,冲刺当天晚10点前发布一篇随笔,共八篇. 另 ...

  2. JMeter中返回Json数据的处理方法(转)

    Json 作为一种数据交换格式在网络开发,特别是 Ajax 与 Restful 架构中应用的越来越广泛.而 Apache 的 JMeter 也是较受欢迎的压力测试工具之一,但是它本身没有提供对于 Js ...

  3. Errors running builder 'DeploymentBuilder' on project

    Errors running builder 'DeploymentBuilder' on project 1.修改java源代码后点击保存,IDE 自动编译并热部署,提示如下错误: Errors o ...

  4. Java8 Lambda和Stream的用法

    package com.zhangxueliang.demo; import java.util.ArrayList; import java.util.List; import java.util. ...

  5. java随笔5 完整路径的应用

    不仅类,函数,甚至参数都可以获取完整路径

  6. Client将数据读写HDFS流程

    HDFS介绍 HDFS(Hadoop Distributed File System )Hadoop分布式文件系统.是根据google发表的论文翻版的. 什么是分布式文件系统 分布式文件系统(Dist ...

  7. python爬虫之requests的基本使用

    简介 Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库,Requests它会比urllib更加方便,可以节约我们大量的工作. 一 ...

  8. github上测试服出现bug,如何回滚并获得合并之前的分支

    使用场景: 当我们提交了一个pr,但是该pr合并之后,经过在测试测试有问题,需要回滚.这个时候主master代码将会被回滚到提交你的pr之前的代码.而你的pr由于已经被合并过了,所以无法继续提交. 这 ...

  9. windows 10 multi virtual desktop keyboard shortcut

    windows 10 multi virtual desktop keyboard shortcut windows 10 multi desktop keyboard shortcut https: ...

  10. React Native & debug & debugger

    React Native & debug & debugger http://localhost:8081/debugger-ui/ react-devtools # yarn: $ ...