题目链接: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的更多相关文章

随机推荐

  1. 利用ngModel相关属性及方法自定义表单验证指令

    这是一个只能输入偶数的验证指令

  2. 再谈API GateWay服务网关

    前面在谈微服务架构的时候,我博客上转过Chris Richardson 微服务系列中对微服务网关的描述: 通常来说,使用 API 网关是更好的解决方式.API 网关是一个服务器,也可以说是进入系统的唯 ...

  3. 每日英语:A Better Way To Treat Anxiety

    Getting up the nerve to order in a coffee shop used to be difficult for 16-year-old Georgiann Steely ...

  4. vue 和ng的区别

    vue:    读音:    v-u-e    view vue到底是什么?        一个mvvm框架(库).和angular类似        比较容易上手.小巧    mvc:       ...

  5. CentOS 6.2修改主机名

    写在前面的话:因为服务器要统一主机名,但是在安装的时候忘记设置了,所以需要修改主机名   需要修改两处:一处是/etc/sysconfig/network,另一处是/etc/hosts,只修改任一处会 ...

  6. 手把手教做Excel直方图

    手把手教做Excel直方图 2017-10-05  作者:ExcelHome  阅读:71968次   直方图是用于展示数据的分组分布状态的一种图形,用矩形的宽度和高度表示频数分布,通过直方图,用户可 ...

  7. 【Hadoop】HA 场景下访问 HDFS JAVA API Client

    客户端需要指定ns名称,节点配置,ConfiguredFailoverProxyProvider等信息. 代码示例: package cn.itacst.hadoop.hdfs; import jav ...

  8. maven编译插件版本配置案例

    <!-- Build Settings 构建设置 --> <build> <finalName>${project.artifactId}</finalNam ...

  9. python的zipfile实现文件目录解压缩

    主要是 解决了压缩目录下 空文件夹 的压缩 和 解压缩问题 压缩文件夹的函数: # coding:utf- import os import zipfile def zipdir(dirToZip,s ...

  10. javascript弹出层-DEMO001

    首先上一张图 看下弹出层的效果 从图中可以看到二部分 一是弹出层 二是遮照层 弹出层:即弹出你要操作的内容 遮照层:遮照住不要操作的内空 实际技术原理主要是 CSS +JS  (z-index是核心) ...