QOJ # 9435. Welcome to NPCAPC/C - npcapc

题意

有 \(t\) 次询问,每次给出一个 \(n\),问有多少个长度为 \(n\) 的包含大小写的字符串满足包含 \(\texttt{NPCAPC}\) 和 \(\texttt{npcapc}\) 两个子序列。\(t\le 5000,n \le 10^9\)。

思路

首先考虑直接计数,发现要去重,需要很复杂的容斥,很难做。

考虑 DP 然后矩阵快速幂优化。

设 \(f_{i,x,y}\) 表示考虑到字符串第 \(i\) 位,大写串已经匹配了 \(x\) 位,小写串已经匹配了 \(y\) 位,的方案数。枚举这一位填写什么字母即可转移。

考虑用矩阵快速幂优化 \(i\) 这一维。把 \(x,y\) 压成一维,初始矩阵是一个 \(49\times 1\) 的矩阵,其中 \(f_{0,0}=1\)。转移矩阵是一个 \(49 \times 49\) 的矩阵。因此求一个 \(n\) 时间复杂度是 \(m=49,O(m^3\log n)\) 的。

然而我们有 \(t\) 次询问。\(O(t m^3 \log n)\) 会爆。一个技巧是存下转移矩阵的 \(2^0,2^1 ,\dots 2^k\) 次幂。因为矩阵乘法满足结合律,我们要求的是转移矩阵的若干次幂乘上初始矩阵,因此可以从右边往左边算,初始矩阵是 \(m \times 1\) 的,这样时间复杂度就是 \(O(m^2 \log n)\) 的了。预处理 \(O(m^3 \log n)\),询问 \(O(t m^2 \log n)\)。

code

代码并不难写。自我感觉马蜂写得很优美很整洁。

#include<bits/stdc++.h>
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
typedef long long ll;
constexpr int mod=998244353,B=49,lg=29;
int t,n;
int add(int a,int b) { return a+b>=mod?a+b-mod:a+b; }
void _add(int &a,int b) { a=add(a,b); }
struct juzhen {
int x[B][B];
juzhen () { memset(x,0,sizeof(x)); }
juzhen operator * (const juzhen b) const {
juzhen c;
rep(i,0,B-1) rep(j,0,B-1) rep(k,0,B-1) _add(c.x[i][j],1ll*x[i][k]*b.x[k][j]%mod);
return c;
}
void makezhuanyi() {
x[0][0]=52;
rep(i,1,6) x[i][i]=51;
rep(i,1,6) x[i*7][i*7]=51;
rep(i,1,6) rep(j,1,6) x[i*7+j][i*7+j]=50;
rep(i,0,6) rep(j,1,6) x[i*7+j][i*7+j-1]=1;
rep(i,1,6) rep(j,0,6) x[i*7+j][(i-1)*7+j]=1;
}
}b[30],zhuanyi;
void init() {
b[0]=zhuanyi;
rep(i,1,lg) b[i]=b[i-1]*b[i-1];
}
struct juzhen2 {
int x[B];
juzhen2 () { memset(x,0,sizeof(x)); }
void makeinit() { x[0]=1; }
}f0,ans;
juzhen2 operator * (juzhen a,juzhen2 b) {
juzhen2 c;
rep(i,0,B-1) rep(j,0,B-1) _add(c.x[i],1ll*a.x[i][j]*b.x[j]%mod);
return c;
}
int main() {
zhuanyi.makezhuanyi();
sf("%d",&t);
init();
f0.makeinit();
while(t--) {
sf("%d",&n);
ans=f0;
rep(i,0,lg) {
if((n>>i)&1) ans=b[i]*ans;
}
pf("%d\n",ans.x[48]);
}
}

QOJ # 9435. Welcome to NPCAPC/C - npcapc的更多相关文章

  1. POJ1149 PIGS [最大流 建图]

    PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20662   Accepted: 9435 Description ...

  2. MongoDB【第三篇】MongoDB基本操作

    MongoDB的基本操作包括文档的创建.删除.和更新 文档插入 1.插入 #查看当前都有哪些数据库 > show dbs; local 0.000GB tim 0.000GB #使用 tim数据 ...

  3. 会务准备期间材料准备工作具体实施总结 ----(vim技巧应用, python信息提取与整合, microsoft word格式调整批量化)

    会务准备期间材料准备工作具体实施总结(vim, python, microsoft word) span.kw { color: #007020; font-weight: bold; } code ...

  4. java web学习总结(二) -------------------TOMCAT使用帮助(一)

    一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...

  5. Python之路【第二十一篇】Django ORM详解

    ORM回顾 关系对象映射(Object Relational Mapping,简称ORM). django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表. 对于ORM框 ...

  6. OAF_开发系列29_实现OAF中批次处理迭代器RowSet/RowSetIterator(案例)

    20150814 Created By BaoXinjian

  7. 【Hello CC.NET】自动化发布时 Web.config 文件维护

    在 <[Hello CC.NET]CC.NET 实现自动化集成> 的 HellowWorld 中经实现: 1.获取源码 2.编译项目 3.集成测试 4.Ftp发布项目 5.创建安装包 6. ...

  8. Tomcat 的使用学习

    一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...

  9. SoapUI调用webservice实现的两种方式

    SoapUI用来做测试,已经是很多人做过的事情了,而且网上教程也很多.不过还是写下来,对比webservice协议与http协议脚本编写的不同. 首先测接口得有一个服务,刚好笔者所在项目做ESB集成. ...

  10. PHP文件操作系统----主要的文件操作函数

    一.文件操作系统概述 1.概述: php中的文件操作系统主要是对文件和目录的操作.文件在windows系统下分为3种不同:文件.目录.未知,在linux/unix系统下分为7种不同:block.cha ...

随机推荐

  1. steam发行问题

    非常重要,最新steam营销推广 https://store.steampowered.com/news/group/4145017/view/4191238396458987547

  2. npm 报错cb.apply is not a function问题小结

    npm 报错cb.apply is not a function问题小结 问题描述: 解决方案: 方案一 运行vue的时候在本级终端运行(这是我解决的方法) 方案二 去找版本对应问题 https:// ...

  3. Gitlab 权限级别

    Gitlab 权限级别: GitLab中的权限级别从低到高包括: Guest(访客) Reporter(报告者) Developer(开发者) Maintainer(维护者) Owner(所有者) 通 ...

  4. AXUI v3.1.27震撼发布:全新Viewer媒体查看器模块和Toast短消息模块

    更新内容 修复Range组件使用reset方法无效的问题 将 Range 库的参数从 aixs 改为 flow,可选值为 h/v(水平/垂直) 修复Datetime组件在手机端下拉年份和月份高度不正确 ...

  5. go学习笔记:go func() { ... }() 启动了一个新的协程,为什么go 后面的函数没有打印?

    代码如下: func main() { go func() { fmt.Println("run goroutine in closure") }() } 原因分析: go fun ...

  6. git-下载

    1.从https://gitforwindows.org/下载最新的或者这里https://git-scm.com/

  7. 客户案例|不需要到健身房的互动健身,so cool!

    拥有健康的体魄,坚持进行身材管理,这是全民健身时代的必然要求. 全民健身 自2020年来,虽然健身房的防疫限制逐渐放松,仍有越来越多的人选择在家中健身.根据移动营销数据分析平台Adjust 的应用数据 ...

  8. poi读excel的空cell时,产生空指针

    背景 昨天,我用poi读取excel时,当读到空的cell时,抛出个空指针异常.但是当我读取别的excel时,即使cell为空,也不抛空指针啊,读出结果为"". 我就想一探究竟 过 ...

  9. JDK,JRE与JVM

    JDK,JRE与JVM JDK 定义: JDK,全称Java Development Kit,(又称为Java SDK,Java Software Development Kit) ,是 Java 语 ...

  10. vue2.0插槽的使用

    Vue2.0插槽的使用 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...