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的更多相关文章
随机推荐
- Virtex6 PCIe 超简版基础概念学习(二)
Virtex6 PCIe 超简版基础概念学习(二) 分类:FPGAPCIe (2081) (0) 举报 收藏 文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 ise14.7 ...
- 线程相关函数(6)-pthread_cond_wait(),pthread_cond_signal(), 条件变量
pthread_cond_tpthread_cond_initpthread_cond_destroypthread_cond_waitpthread_cond_timedwaitpthread_co ...
- Eclipse上Hadoop插件中Run On Hadoop原理[转]
通过Eclipse的hadoop插件中的"run on hadoop"命令的原理:它不是把jar包发送到hadoop集群上去运行,而只是使用了hadoop集群上的hdfs,从hdf ...
- Linux IO实时监控iostat命令详解(转载)
简介 iostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息.用户可以通过指定统计的次数和时间 ...
- trk压力测试工具(测试tcp)
wrk 是web站点压力测试工具 针对tcp协议的压力测试工具,没有找到合适的. 自己写一个,起名 trk.
- java POi excel 写入大批量数据
直接贴代码: package jp.co.misumi.mdm.batch.common.jobrunner; import java.io.File; import java.io.FileNotF ...
- Tiny4412 虚拟机交叉编译环境的设置以及编译u-boot 和 kernel
从CD 里面拷贝如下文件到虚拟机里面 解压 查看是否有如下文件 tiny4412_qt@chenfl:~/tiny4412$ ls opt/FriendlyARM/toolschain/4.5.1/b ...
- [shell]简单的shell提示和参数脚本
该shell脚本有如下点: bash or dash case语句的写法 脚本help写法 参数是否为空的写法 算数运算的写法 #! /bin/bash case "$1" in ...
- fontDialog-字体对话框和colorDialog-颜色对话框
private void button1_Click(object sender, EventArgs e) { DialogResult dr = fontDialog1.ShowDialog(); ...
- TCP协议格式
TCP协议 协议格式 0 16 31 |16位源端口 | 16位目标端口| | 32位序号 | | 32位确认序号 | |4位首部长度|保留(6位)|URG|ACK|PSH|RST|SYN|FIN|1 ...