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的更多相关文章
随机推荐
- mysql 主主复制(双主复制)报错Last_SQL_Errno: 1146
Last_Errno: 1146 Last_Error: Error 'Table 'test.user' doesn't exist' on query. Default database: 'te ...
- cnblogs博客迁移到hexo
cnblogs博客备份 备份地址:https://i.cnblogs.com/BlogBackup.aspx?type=1 备份文件为xml格式,打开备份文件,如下所示: <?xml versi ...
- IIS短文件名泄露漏洞危害及防范方法(转)
攻击方法(转自http://blog.sina.com.cn/s/blog_64a3795a01017xqt.html) 一直在寻找一种方法,如果我可以使用通配符"*" 和 &qu ...
- 跟着百度学PHP[9]-session与cookie的异同
COOKIE cookie是将数据存储在客户端中,以此建立客户端与服务器之间的联系,但是cookie任然有一些局限性: 1.cookie相对不是很安全,容易被盗用导致cookie欺骗. 2.单个的co ...
- Pgsql特殊排序
对字段值为A,B,C,D的时候进行特殊排序. CASE WHEN aa = 'H' THEN ' WHENaa = 'O' THEN ' ELSE aa END 对数字进行排序,升序,0排到最后面 C ...
- java strtus2 拦截器(Interceptors)
在strtus2 中有一个比较重要的东西就是拦截器(Interceptors) 拦截器可以做到在已有的业务中插入一块共通的,比如在一个业务中,直接插入一串登录功能,就不用去每个页面一个个去显示是否登录 ...
- Java反射机制在工厂模式中的应用
在本篇文章中就不详细介绍工厂模式,主要介绍一下反射在工厂模式中的使用,让读者对反射机制带来的好处有更深的认识. 首先看一下简单工厂模式 简单工厂模式(simple factory)是类的创建模式,又叫 ...
- EF应用一:Code First模式
EF的核心程序集位于System.Data.Entity.dll和System.Data.EntityFramework.dll中.支持CodeFirst的位于EntityFramework.dll中 ...
- php之道
PHP The Right Way. Tweet 欢迎 目前网络上充斥着大量的过时资讯,让 PHP 新手误入歧途,并且传播着错误的实践以及不安全的代码.PHP 之道 收集了现有的 PHP 最佳实践.编 ...
- Css三栏布局自适应实现几种方法
Css三栏布局自适应实现几种方法 自适应实现方法我们可以从三个方法来做,一个是绝对定位 ,自身浮动法 和margin负值法了,下面我们一起来看看这三个例子吧,希望例子能帮助到各位同学. 绝对定位法三栏 ...