题目链接: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. 每日英语:The First Day On A Job Is Tough Work

    Why is the first day on the job often the worst? New employees tend to be greeted with stacks of ben ...

  2. 使用filter解决request.getParameter的中文乱码问题

    注意:一般一个站点的所有页面的编码,包括数据库编码都要保持一致,下面默认的编码都是UTF-8 ----------------------------------例1:直接提交到jsp页面------ ...

  3. 从乌云的错误漏洞分析看Mifare Classic安全

    前言 12年2月初国内著名安全问题反馈平台-乌云发布了有关某公司员工卡的金额效验算法破解的安全问题.从整个漏洞分析来看,漏洞的提交者把员工卡的数据分析得非常仔细,以至很多刚刚接触或者未曾接触的都纷纷赞 ...

  4. Android开发之Fragment传递參数的几种方法

    Fragment在Android3.0開始提供,而且在兼容包中也提供了Fragment特性的支持. Fragment的推出让我们编写和管理用户界面更快捷更方便了. 但当我们实例化自己定义Fragmen ...

  5. js 调试问题

    ***********06.  $(this).index() 失效****************************** 使用的库函数jquery 版本过低,1.4以上即可 ********* ...

  6. js学习笔记25----Event对象

    Event : 事件对象,当一个事件发生的时候,和当前这个对象发生的这个事件有关的一些详细的信息都会被临时保存到一个指定的地方-event 对象,供我们在需要时调用. 事件对象必须在一个事件调用的函数 ...

  7. 后台登陆功能的实现 SESSION

    控制器 <?php // 本类由系统自动生成,仅供测试用途 class IndexAction extends Action { public function index(){ $this-& ...

  8. 【BZOJ】1044: [HAOI2008]木棍分割(二分+dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1044 如果只求最大的最小,,直接二分就行了...可是要求方案.. 好神! 我竟然想不到! 因为我们得 ...

  9. 小结:单调栈 & 单调队列

    概要: 对于维护信息具有单调性的性质或者问题可以转化为具有单调性质的模型的题,我们可以考虑用单调栈或单调队列. 技巧及注意: 技巧很多,只要能将问题转化为单调性问题,就好解决了. 当维护固定长度的单调 ...

  10. vs2010更新EF模型时报错

    尝试从数据库进行更新时,遇到类型为“Microsoft.VSDesigner.Data.Local.ConnectionStringConverterServiceException”的异常.异常消息 ...