牛客练习赛35-背单词-线性DP
思路 :dp[ i ] [ 0 ]表示 第i 位放的元音 dp[ i ] [ 1 ]表示 第i 位放的辅音 ,cnt [ i ]含义是 长度为 i 的方案数。
转移 :dp[ i ] [ 0 ] 由 上一个长度的所有方案数 也就是 cnt[ i-1 ] *5 转移而来 。
同理 dp[ i ] [ 1 ] 由 上一个长度的所有方案数 也就是 cnt[ i-1 ] *21 转移而来 。
但是 这是 无任何限制的情况下现在加了限制,连续 元音不超过 a 连续 辅音不超过 b
那么 首先 长度得 > a 或 > b 才会出现这种情况。 那么,当长度i = a +1 时 照常运算dp[ i ] [ 0 ] ,
但是需要减去 产生了 a + 1个元音相连的情况 。 也就是减去 dp[ i - a - 1][ 1 ] * pa 。pa是连续a+1 个元音的各种组合方案数
dp[ i - a - 1][ 1 ] 是去掉 a + 1的长度 之前 最后一个字母为辅音的状态。
同理 当长度i = b +1 时 照常运算dp[ i ] [ 1 ] ,但是需要减去 产生了 b + 1个元音相连的情况 。
也就是减去 dp[ i - b - 1][ 0 ] * pb 。pb是连续b+1 个辅音的各种组合方案数
dp[ i - b - 1][ 0 ] 是去掉 b + 1的长度 之前 最后一个字母为元音的状态。
不会 出现 a + 2 a + 3.....个元音相连,b+2,b + 3 .....个辅音相连 ,因为 a + 1个 元音相连 ,b +1 个辅音相连的情况,
都已经去掉了 ,长度一个一个增加不会产生 b + 2 ,a + 2 后面的也就更不会产生 。
ans 不断 求和 各个长度下的 方案数。
#include<bits/stdc++.h>
using namespace std;
const int mod=1000000007;
#define ll long long
#define maxn 5678
ll pa,pb,dp[maxn][2],cnt[maxn],ans;
int t,n,a,b;
ll qpow(ll a,ll b)
{
ll ret=1;
while(b)
{
if(b%2)
ret=(ret*a)%mod;
a=(a*a)%mod;
b/=2;
}
return ret;
}
int main()
{
dp[0][0]=dp[0][1]=1;
dp[1][0]=5,dp[1][1]=21;
cnt[1]=26;
scanf("%d",&t);
while(t--)
{
ans=26;
scanf("%d%d%d",&n,&a,&b);
pa=qpow(5,a+1);
pb=qpow(21,b+1);
for(int i=2; i<=n; i++)
{
dp[i][0]=5*cnt[i-1]%mod;
dp[i][1]=21*cnt[i-1]%mod;
if(i>a) dp[i][0]=(dp[i][0]-dp[i-a-1][1]*pa+mod)%mod;
if(i>b) dp[i][1]=(dp[i][1]-dp[i-b-1][0]*pb+mod)%mod;
cnt[i]=(dp[i][0]+dp[i][1])%mod;
ans=(ans+cnt[i]+mod)%mod;
}
printf("%lld\n",ans);
}
return 0;
}
牛客练习赛35-背单词-线性DP的更多相关文章
- 牛客练习赛52 | C | [烹饪] (DP,裴蜀定理,gcd)
牛客练习赛52 C 烹饪 链接:https://ac.nowcoder.com/acm/contest/1084/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 327 ...
- 牛客练习赛26B 烟花 (概率DP)
链接:https://ac.nowcoder.com/acm/contest/180/B 来源:牛客网 烟花 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5 ...
- 牛客练习赛35 C.函数的魔法
链接 [https://ac.nowcoder.com/acm/contest/32] 题意 题目描述 一位客人来到了此花亭,给了女服务员柚一个数学问题:我们有两个函数,F(X)函数可以让X变成(XX ...
- 牛客练习赛37-筱玛的字符串-DP递推
筱玛的字符串 思路 :dp [ i ] [ j ] [ 3 ] 分别代表到第 i 位时 左括号比右括号多 j ,后面有三个状态 分别表示当前位置 S3的字符 是正在反转的,还是 反转完成的,还是没有反 ...
- 牛客练习赛71 数学考试 题解(dp)
题目链接 题目大意 要你求出有多少个长度为n的排列满足m个限制条件 第i个限制条件 p[i]表示前 p[i]个数不能是1-p[i]的排列 题目思路 这个感觉是dp但是不知道怎么dp 首先就是要明白如果 ...
- 牛客练习赛69 火柴排队 题解(dp)
题目链接 题目大意 给你一个长为n(n<=5e3)的数组a.随机使得k个元素增加d.要你求多大的概率使得,这些数组元素的相对大小不发生改变 输出 n 行每行一个整数,第 i 行的整数表示 k=i ...
- 牛客练习赛71 C.数学考试 (DP,容斥原理)
题意:RT 题解:先对\(p\)排个序,然后设\(dp[i]\)表示前\(i-1\)个\(p[i]\)满足条件但是\(p[i]\)不满足,即在\([1,p[i]]\)中不存在从\(p[1]\)到\(p ...
- 牛客练习赛39 C 流星雨 (概率dp)
题意: 现在一共有n天,第i天如果有流星雨的话,会有wi颗流星雨. 第1天有流星雨的概率是p1. 如果第i−1 (i≥2)天有流星雨,第i天有流星雨的可能性是pi+P,否则是pi. 求n天后,流星雨颗 ...
- 牛客练习赛26:D-xor序列(线性基)
链接:牛客练习赛26:D-xor序列(线性基) 题意:小a有n个数,他提出了一个很有意思的问题:他想知道对于任意的x, y,能否将x与这n个数中的任意多个数异或任意多次后变为y 题解:线性基 #inc ...
- 牛客练习赛53 A 超越学姐爱字符串 (DP)
牛客练习赛53 超越学姐爱字符串 链接:https://ac.nowcoder.com/acm/contest/1114/A来源:牛客网 超越学姐非常喜欢自己的名字,以至于英文字母她只喜欢" ...
随机推荐
- Redis事务概念
redis事务与监控 Author:SimpleWu GitHub-redis 在redis中它的事务与批处理非常相似 Redis中的事务(transaction)是一组命令的集合.事务同命令一样都是 ...
- cf842C 树形dp+gcd函数
树形dp用一下就好了 /* dp[i]表示不删节点的gcd值 每个结点开个vector用来存储删一个点之后的最大值 然后排序 去重 */ #include<bits/stdc++.h> # ...
- 纯CSS3超酷3D旋转立方体动画特效
简要教程 这是一款神奇的纯 CSS3 立方体动画特效插件.使用CSS3来制作动画效果已经成为WEB前端开发的一种时尚,从简单的颜色和尺寸动画,到复杂的旋转.翻转动画, CSS3 展现了它无穷的魅力.使 ...
- GetComputerNameEx()
昨晚看了MSDN提供的GetComputerNameEx function(参考:https://msdn.microsoft.com/en-us/library/windows/desktop/ms ...
- JAVA 程序编译过程;编辑器,编译器和解释器
最基本的软件工具包括,编辑器,编译器,解释器; 编译器:编译器就是将一种编程语言代码翻译成另一种语言的等效代码程序. 解释器:解释器将编译和执行交织在一起,即编译一部分代码后执行该部分代码,然后再编译 ...
- MyBatis配置:在控制台打印SQL语句
1.在spring-mybatis.xml中配置语句 注意:value=”classpath:mybatis-config.xml”这个文件如果之前没有,是需要新建的 2.新建mybatis-con ...
- C#学习-析构函数
析构函数用于在类销毁之前释放类实例所使用的托管和非托管资源. 对于C#应用程序所创建的大多数对象,可以依靠.NET Framework的垃圾回收器(GC)来隐式地执行内存管理任务. 但是,若创建封装了 ...
- Python_lambda简单函数表达式
lambda表达式只能用于简单函数的书写 def funx(a): a+=1 return a print(funx(99)) 用lambda实现上面函数: funx = lambda a: a+1 ...
- Flink--将表转换为DataStream或DataSet
A Table可以转换成a DataStream或DataSet.通过这种方式,可以在Table API或SQL查询的结果上运行自定义的DataStream或DataSet程序 将表转换为DataSt ...
- 实际生产用法CMS和G1
java -Xms100m -Xmx100m -Xmn50m -XX:MetaspaceSize=20m -XX:MaxMetaspaceSize=20m -XX:+UseConcMarkSweepG ...