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& ...
随机推荐
- 使用JAVA导出EXCEL表格(POI)
一.POI概述 Jakarta POI 是一套用于访问微软格式文档的Java API.POI提供API给Java程序对Microsoft Office格式档案读和写的功能.在许多企业办公系统中,经常会 ...
- 适合小白的大白话讲解--->Git与Github的区别
本文由 伯乐在线 - 听风 翻译,艾凌风 校稿.未经许可,禁止转载!英文出处:Red Radger.欢迎加入翻译组. 本文旨在使用通俗易懂的文字,讲解版本控制背后的理论,以便你能对程序员们如何工作有个 ...
- 洛谷题解 P1134 【阶乘问题】
原题传送门 题目描述 也许你早就知道阶乘的含义,N阶乘是由1到N相乘而产生,如: 12!=1×2×3×4×5×6×7×8×9×10×11×12=479,001,600 12的阶乘最右边的非零位为6. ...
- centos7虚拟机分配静态IP但是得不到IP、不能上网一种可能的原因和解决办法
1.首先通过ifconfig查看网卡,发现网卡名称为ens33 2. 在/etc/sysconfig/network-scripts/目录下查看网络配置文件 3. 发现有ifcfg-eth0的配置文件 ...
- 论文阅读笔记(十五)【CVPR2016】:Top-push Video-based Person Re-identification
Approach 特征由两部分组成:space-time特征和外貌特征.space-time特征由HOG3D[传送门]提取,其包含了空间梯度和时间动态信息:外貌特征采用颜色直方图[传送门]和LBP[传 ...
- Lucene使用IKAnalyzer分词
1.分析器 所有分析器最终继承的类都是Analyzer 1.1 默认标准分析器:StandardAnalyzer 在我们创建索引的时候,我们使用到了Index ...
- pycharm-1
Python 1.4解释器(运行文件) 1.5注释:#单行,ctrl+/ 多行注释 ””” ””” 2.1变量 assert,except:lambda; nonlocal; 2.2数据类 ...
- Ubuntu中FTP安装配置及基本概念(原创)
注:本文出自博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 本文源链接:https://www.cnblogs.com/chloneda/p/ftp-inst ...
- Java设计模式(四)工厂方法模式
定义与类型 定义:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行. 类型:创建型 适用场景 创建对象需要大量重复的代码 客户端(应用层)不依赖于产 ...
- 洛谷【P2022 有趣的数】 题解
题目链接 https://www.luogu.org/problem/P2022 题目描述 让我们来考虑1到N的正整数集合.让我们把集合中的元素按照字典序排列,例如当N=11时,其顺序应该为:1,10 ...