HDU3658—How many words
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3658
题目意思: 题目的意思是在52个英文字母里面选择m个字母组成一个字符串,满足以下两个条件。第一是相邻的两个字符的ASCLL码的绝对值小于等于32,第二至少要有一对的字符的绝对值为32。
思路:补集的思想,先求出相邻字符小于等于32的,在求出相邻字符小于32的,两个一减不就是至少有一对字符相邻绝对值等于32的吗,开一个数组d[i][j]代表有i个字符相邻字符小于等于32且最后一位字符为j的数量,再开一个数组g[i][j]代表有i个字符相邻字符小于32且最后一位字符为j的数量。
我们可以得到d[i][j]的状态转移方程为d[i][j]=∑d[i-1][x](x为与j相邻小于等于32的字符)。
我们可以得到g[i][j]的状态转移方程为g[i][j]=∑g[i-1][x](x为与j相邻小于32的字符)。
最后把计算∑d[n][x]-g[n][x](x为52个字母之一)。
系数矩阵d:
系数矩阵g:
代码:以上为系数矩阵
//Author: xiaowuga
#include<bits/stdc++.h>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
#define N 55
using namespace std;
const int MOD=;
typedef long long ll;
ll n,size=;//第n项,矩阵大小
struct Matrix{
ll mat[N][N];
void clear(){
memset(mat,,sizeof(mat));
}
Matrix operator * (const Matrix & m) const{
Matrix tmp;
int i ,j,k;
tmp.clear();
for( i=;i<size;i++)
for( k=;k<size;k++){
if(mat[i][k]==) continue;
for( j=;j<size;j++){
tmp.mat[i][j]+=(mat[i][k]*m.mat[k][j]%MOD+MOD)%MOD;
tmp.mat[i][j]%=MOD;
}
}
return tmp;
}
};
Matrix POW(Matrix m,ll k){
Matrix ans;
memset(ans.mat,,sizeof(ans.mat));
for(int i=;i<size;i++) ans.mat[i][i]=;
while(k){
if(k&) ans=ans*m;
k/=;
m=m*m;
}
return ans;
}
int main() {
ios::sync_with_stdio(false);cin.tie();
Matrix m;
m.clear();
for(int i=;i<;i++){
for(int j=;j<=i+;j++){
m.mat[i][j]=;
}
}
for(int i=;i<;i++){
for(int j=i-;j<;j++)
m.mat[i][j]=;
}
Matrix g;
g.clear();
for(int i=;i<;i++){
for(int j=;j<i+;j++){
g.mat[i][j]=;
}
}
for(int i=;i<;i++){
for(int j=i-+;j<;j++)
g.mat[i][j]=;
}
int T;
cin>>T;
while(T--){
cin>>n;
Matrix ans1=POW(m,n-);
ll sum1=;
for(int i=;i<;i++)
for(int j=;j<;j++){
sum1+=(ans1.mat[i][j]%MOD+MOD)%MOD;
sum1%=MOD;
}
Matrix ans2=POW(g,n-);
ll sum2=;
for(int i=;i<;i++)
for(int j=;j<;j++){
sum2+=(ans2.mat[i][j]%MOD+MOD)%MOD;
sum2%=MOD;
}
cout<<(sum1-sum2+MOD)%MOD<<endl;
}
return ;
}
HDU3658—How many words的更多相关文章
随机推荐
- [svc]expect的爱恨情仇
背景 openvpn生成证书想把它做成一键化,这样添加新用户时候就方便 遇到的问题 我的代码 gg_vpn_keys.exp #!/usr/bin/expect set user [lindex $a ...
- cnblogs博客迁移到hexo
cnblogs博客备份 备份地址:https://i.cnblogs.com/BlogBackup.aspx?type=1 备份文件为xml格式,打开备份文件,如下所示: <?xml versi ...
- 02、Universal app 中按钮图标使用
前言,windows10 昨天凌晨发布了,windows store 开发模型比以前的 silverlight 模型由很多优势, 我也小兴奋了一把. 正文: 在 windows phone 8.0 以 ...
- Makefile 9——为依赖关系文件建立依赖关系
现在我们再对complicated项目做一些更改,增加程序文件间依赖关系的复杂度. /× main.c ×/ #include"foo.h" int main(void) { fo ...
- JavaScript 框架 jQuery 的下载和安装
jQuery 简介: jQuery 是一个 JavaScript 库. jQuery 极大地简化了 JavaScript 编程. jQuery 很容易学习. jQuery 下载: // 官网: htt ...
- ardunio I2C
I2C总线定义I2C(‘intel’ -Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备.在主从通信中,可以有多个I2C总线器件同 ...
- MyBatis常用对象SqlSessionFactory和SqlSession介绍和运用
学习框架一个比较好的路径阅读源码.本文介绍的SqlSessionFactory和SqlSession.可以通过了解SqlSessionFactory接口和SqlSession接口以及两个的实现类入手, ...
- 函数 free 的原型
函数 free 的原型如下: void free( void * memblock ); 为什么 free 函数不象 malloc 函数那样复杂呢? 这是因为指针 p 的类型以及它所指 的内存的容量事 ...
- HashSet非常的消耗空间,TreeSet因为有排序功能,因此资源消耗非常的高,我们应该尽量少使用
注:HashMap底层也是用数组,HashSet底层实际上也是HashMap,HashSet类中有HashMap属性(我们如何在API中查属性).HashSet实际上为(key.null)类型的Has ...
- HttpModule的简单示例
1.HttpModule可用在asp.net 管线事件触发的过程中.. 可处理一些通用的操作,如给特定请求加 gzip压缩. 2.示例代码: using System; using System.We ...