HDU - 3658 How many words 矩阵快速幂
来源:互联网 发布:51单片机控制wifi模块 编辑:程序博客网 时间:2024/05/23 19:03
题目大意:要求你填一个含有m个字符的字符串,每个位只能填a-z,A-Z
有两条规则:
1.相邻两个字符的ascii差不能超过32
2.相邻的字符中至少存在一个ascii差为32的
解题思路:用所有情况 - 不满足的情况
矩阵表示的话,初始矩阵是1行52列的,每一列表示以某个字符结尾的数量有多少个,变化的矩阵是就可以相应推出了。具体看下代码,B表示变化矩阵
#include<cstdio>typedef long long ll;const ll mod = 1e9 + 7;const int N = 52;struct Matrix { ll mat[N][N];}A, B, tmp;int n, temp;void init() { for(int i = 0; i < N; i++) for(int j = 0; j < N; j++) { A.mat[i][j] = B.mat[i][j] = 0; if(i == j) B.mat[i][j] = 1; } for(int i = 0; i <= 25; i++) for(int j = 0; j <= 26 + i; j++) A.mat[j][i] = 1; for(int i = 26; i < N; i++) for(int j = i - 26; j < N; j++) A.mat[j][i] = 1;}void init2() { for(int i = 0; i < N; i++) for(int j = 0; j < N; j++) { A.mat[i][j] = B.mat[i][j] = 0; if(i == j) B.mat[i][j] = 1; } for(int i = 0; i <= 25; i++) for(int j = 0; j <= 25 + i; j++) A.mat[j][i] = 1; for(int i = 26; i < N; i++) for(int j = i - 25; j < N; j++) A.mat[j][i] = 1;}Matrix matMul(const Matrix &x, const Matrix &y) { for(int i = 0; i < N; i++) for(int j = 0; j < N; j++) { tmp.mat[i][j] = 0; for(int k = 0; k < N; k++) tmp.mat[i][j] = (tmp.mat[i][j] + x.mat[i][k] * y.mat[k][j]) % mod; } return tmp;}void solve() { while(n) { if(n & 1) B = matMul(B,A); A = matMul(A,A); n >>= 1; }}int main() { int test; scanf("%d", &test); while(test--) { scanf("%d", &n); if(n == 2) { printf("52\n"); } else { init(); temp = n; n -= 1; solve(); ll ans = 0; for(int i = 0; i < N; i++) for(int j = 0; j < N; j++) ans += B.mat[i][j] % mod; ans %= mod; init2(); n = temp - 1; solve(); ll ans2 = 0; for(int i = 0; i < N; i++) for(int j = 0; j < N; j++) ans2 += B.mat[i][j]; ans2 %= mod; printf("%I64d\n", (ans + mod - ans2) % mod); } } return 0;}
0 0
- HDU - 3658 How many words 矩阵快速幂
- HDU 3658 How many words (矩阵快速幂&递推)
- hdu 3658 HDU 3658 How many words(矩阵快速幂)
- HDU3658 How many words 矩阵快速幂
- hdu3658 How many words 矩阵快速幂 + dp
- hdu 3658 How many words dp+矩阵连乘
- HDU 3658 How many words
- hdu 3658 How many words
- hdu 2157 How many ways_ 矩阵快速幂
- HDU-2157 How many ways?? 矩阵快速幂
- hdu 2157 How many ways?? (矩阵快速幂)
- HDU 2157 How many ways??(经典矩阵快速幂)
- HDU 2157 How many ways??(矩阵快速幂)
- hdu 2157 How many ways?? 矩阵快速幂
- HDU 2157 How many ways??(矩阵快速幂)
- HDU 2157 How many ways??(矩阵的快速幂)
- HDU 2157 How many ways?? 矩阵快速幂
- HDU 2157 How many ways??(矩阵快速幂)
- Codeforces #286 Div 1 简要题解
- 用Python和Pygame写游戏-从入门到精通(7)
- 项目管理修炼之道(三 使用生命周期组织项目)
- 面试题:switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
- 简述三个范式的含义
- HDU - 3658 How many words 矩阵快速幂
- 用Python和Pygame写游戏-从入门到精通(8)
- 我为虎嗅设计APP(一)-逻辑梳理
- Python 的 Socket 编程教程
- Android View 分析(下)
- HADOOP全排序
- 用Python和Pygame写游戏-从入门到精通(9)
- 微信打赏功能暗示内容付费时代渐近
- JS中的call()和apply()方法