2019牛客多校第五场 G subsequence 1 dp+组合数学
subsequence 1
题意
给出两个数字串s,t,求s的子序列中在数值上大于t串的数量
分析
数字大于另一个数字,要么位数多,要么位数相同,字典序大,位数多可以很方便地用组合数学来解决,所以只剩下了位数相同的情况,如何实现呢,我们考虑定义状态dp[i][j][0/1]分别表示s串前i个字符中长度为j的串前面的字符等于t串相应长度的前缀的数量,1则表示大于的数量 ,然后分三种情况转移即可。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll P=998244353;
const int maxn=3005;
const int M=3005;
char s[maxn],t[maxn];
ll dp[maxn][maxn][2];
ll F[maxn],Finv[maxn],inv[maxn];
ll pw(ll bs,ll x){
ll ans=1;
while(x){
if(x&1)ans=ans*(bs%P)%P;
bs=bs*(bs%P)%P;
x>>=1;
}
return ans;
}
void init(){
F[1]=Finv[1]=inv[1]=Finv[0]=inv[0]=1;
for(int i=2;i<M;i++)inv[i]=inv[P%i]*(P-P/i)%P;
for(int i=2;i<M;i++){
Finv[i]=Finv[i-1]*inv[i]%P;
F[i]=F[i-1]*i%P;
}
}
ll C(int n,int m){
if(m<0||n<m)return 0;
if(m==0||n==m)return 1;
return F[n]%P*(Finv[n-m]%P)%P*Finv[m]%P;
}
int main(){
int n,m;
int T;
scanf("%d",&T);
init();
while(T--){
scanf("%d%d",&n,&m);
scanf("%s%s",s+1,t+1);
for(int i=0;i<=n;i++)for(int j=0;j<=m;j++)for(int k=0;k<2;k++)dp[i][j][k]=0;
dp[0][0][0]=1;
for(int i=1;i<=n;i++){
dp[i][1][0]=dp[i-1][1][0];
dp[i][1][1]=dp[i-1][1][1];
if(s[i]==t[1]&&t[1]!='0'){dp[i][1][0]++;dp[i][1][0]%=P;}
if(s[i]>t[1]){dp[i][1][1]++;dp[i][1][1]%=P;}
for(int j=2;j<=max(m,i);j++){
if(s[i]<t[j]){
dp[i][j][0]=dp[i-1][j][0];
dp[i][j][1]=(dp[i-1][j][1]+dp[i-1][j-1][1])%P;
}
else if(s[i]==t[j]){
dp[i][j][0]=(dp[i-1][j][0]+dp[i-1][j-1][0])%P;
dp[i][j][1]=(dp[i-1][j-1][1]+dp[i-1][j][1])%P;
}
else if(s[i]>t[j]){
dp[i][j][1]=(dp[i-1][j-1][0]+dp[i-1][j-1][1]+dp[i-1][j][1])%P;
dp[i][j][0]=dp[i-1][j][0];
}
}
}
long long sum=dp[n][m][1];
/*for(int i=m;i<=n;i++){
sum=dp[i][m][1];sum%=P;
}*/
for(int i=1;i<=n-m;i++){
if(s[i]=='0')continue;
for(int j=m;j<=n-i;j++){
sum+=C(n-i,j);sum%=P;
}
}
printf("%lld\n",sum);
//cout<<sum<<endl;
/*for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<"1 :"<<dp[i][j][1]<<" 0: "<<dp[i][j][0]<<" ||";
}
cout<<endl;
}*/
}
return 0;
}
2019牛客多校第五场 G subsequence 1 dp+组合数学的更多相关文章
- 2019牛客多校第五场H - subsequence 2 拓扑
H - subsequence 2 题意 要你使用前\(m\)个小写字母构造一个长度为\(n\)的字符串 有\(m*(m-1)/2\)个限制条件: \(c_{1} .c_{2}. len\):表示除去 ...
- 牛客多校第五场 G subsequence 1 最长公共子序列/组合数
题意: 给定两个由数字组成的序列s,t,找出s所有数值大于t的子序列.注意不是字典序大. 题解: 首先特判s比t短或一样长的情况. 当s比t长时,直接用组合数计算s不以0开头的,长度大于t的所有子序列 ...
- 2019牛客多校第五场 generator 1——广义斐波那契循环节&&矩阵快速幂
理论部分 二次剩余 在数论中,整数 $X$ 对整数 $p$ 的二次剩余是指 $X^2$ 除以 $p$ 的余数. 当存在某个 $X$,使得式子 $X^2 \equiv d(mod \ p)$ 成立时,称 ...
- 2019牛客多校第五场generator2——BSGS&&手写Hash
题目 几乎原题 BZOJ3122题解 分析 先推一波公式,然后除去特殊情况分类讨论,剩下就是形如 $a^i \equiv b(mod \ p)$ 的方程,可以使用BSGS算法. 在标准的BSGS中,内 ...
- 2019牛客多校第五场F maximum clique 1 最大独立集
题意:给你n个数,现在让你选择一个数目最大的集合,使得集合中任意两个数的二进制表示至少有两位不同,问这个集合最大是多大?并且输出具体方案.保证n个数互不相同. 思路:容易发现,如果两个数不能同时在集合 ...
- 2019牛客多校第五场G-subsequence 1 DP
G-subsequence 1 题意 给你两个字符串\(s.t\),问\(s\)中有多少个子序列能大于\(t\). 思路 令\(len1\)为\(s\)的子序列的长度,\(lent\)为\(t\)的长 ...
- 2019牛客多校第五场 B - generator 1 矩阵快速幂+十倍增+二进制倍增优化
B - generator 1 题意 给你\(x_{0}.x_{1}.a.b.b.mod\),根据\(x_{i} = a*x_{i-1} + b*x_{i-2}\)求出\(x_{n}\) 思路 一般看 ...
- 2019牛客多校第五场B-generator 1(矩阵快速幂)
generator 1 题目传送门 解题思路 矩阵快速幂.只是平时的矩阵快速幂是二进制的,这题要用十进制的快速幂. 代码如下 #include <bits/stdc++.h> #defin ...
- 2019 牛客多校第五场 B generator 1
题目链接:https://ac.nowcoder.com/acm/contest/885/B 题目大意 略. 分析 十进制矩阵快速幂. 代码如下 #include <bits/stdc++.h& ...
随机推荐
- 秋水逸冰实用Linux脚本收藏
秋水逸冰的脚本非常受欢迎,奈何其本人博客已经不能访问(目前是这样,不知道别的地区是否能访问),实际上GitHub上他本人一直在维护,因为某些原因不放出他本人的GitHub地址.截止到2019年12月1 ...
- Bootstrap 手机屏幕自适应的响应式布局开关
head中添加 <meta name="viewport" content="width=device-width, initial-scale=1, shrink ...
- idea中创建maven的Javaweb工程并进行配置
学完maven后,可以创建maven的javaweb工程,在创建完成后还需要一些配置,下面来说下具体步骤,在这里我创建的是一个模块,创建web项目的方式和创建模块一样 1.创建一个模块,点new-Mo ...
- Linux centos7 安装 phpMyAdmin
yum install httpd php mariadb-server –y搭建lamp运行环境之后安装phpMyAdmin遇到的一些问题记录一下 1.官网下载phpMyAdmin压缩包 wget ...
- Function and Function
If we define , do you know what function means? Actually, calculates the total number of enclosed ...
- P1055 ISBN号码(getline(cin,s); printf("%s",str); )
题目描述 每一本正式出版的图书都有一个 ISBN 号码与之对应,ISBN 码包括 9 位数字.1 位识别码和 3 位分隔符,其规定格式如 x-xxx-xxxxx-x,其中符号 - 就是分隔符(键盘上的 ...
- netty 的事件驱动
netty 是事件驱动的,这里面有两个含义,一是 netty 接收到 socket 数据后,会产生事件,事件在 pipeline 上传播,二是事件由特定的线程池处理. NioEventLoop 轮询网 ...
- 【笔记】机器学习 - 李宏毅 - 12 - CNN
Convolutional Neural Network CNN 卷积神经网络 1. 为什么要用CNN? CNN一般都是用来做图像识别的,当然其他的神经网络也可以做,也就是输入一张图的像素数组(pix ...
- 破解版 Teamver 安装
一 .下载安装包 百度网盘链接:https://pan.baidu.com/s/18nEKAMmHEqU66Dq_aCnEYQ 提取码:2x2q 二.解压缩后,直接运行红框内绿色文件即可
- Flex布局如何实现最后一个元素右对齐,或者第一个元素左对齐
先来看看一个例子 在一个div我们把四个按钮全部放到右边去了,看下效果↓ 这个时候我们想把第一个按钮左对齐,其他保持不变 这时候我们来个第一个按钮样式上加上 :margin-right: auto; ...