hdu 2276 矩阵快速幂&&循环矩阵优化
来源:互联网 发布:js 重力感应小球 编辑:程序博客网 时间:2024/05/02 08:02
我们可以用+1之后对2取余来模拟灯的变化。
然后首先构造矩阵:
1 0 0 0 0 0 1
0 1 1 0 0 0 0
0 0 1 1 0 0 0
0 0 0 1 1 0 0
0 0 0 0 1 1 0
0 0 0 0 0 1 1
可以推广到大小为N的矩阵
然后这是一个循环矩阵,要优化一下乘法
AC代码如下:
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const int MAX_N = 110;;int N, M;void multipy( int a[][MAX_N], int am, int an, int b[][MAX_N], int bm, int bn, int c[][MAX_N] ){ for( int i = 1; i <= am; i++ ){ for( int j = 1; j <= bn; j++ ){ c[i][j] = 0; for( int k = 1; k <= an; k++ ){ c[i][j] = ( c[i][j] + a[i][k] * b[k][j] ) % 2; } } }}void multipy1( int a[][MAX_N], int am, int an, int b[][MAX_N], int bm, int bn, int c[][MAX_N] ){ for( int i = 1; i <= 1; i++ ){ for( int j = 1; j <= bn; j++ ){ c[i][j] = 0; for( int k = 1; k <= an; k++ ){ c[i][j] = ( c[i][j] + a[i][k] * b[k][j] ) % 2; } } } for( int i = 2; i <= am; i++ ){ c[i][1] = c[i-1][bn]; for( int j = 2; j <= bn; j++ ){ c[i][j] = c[i-1][j-1]; } }}void get_matrix_pow( int a[][MAX_N], int n ){ int ans[MAX_N][MAX_N] = {0}; int temp[MAX_N][MAX_N]; for( int i = 1; i <= N; i++ ){ ans[i][i] = 1; } while( n ){ if( n % 2 ){ multipy1( ans, N, N, a, N, N, temp ); memcpy( ans, temp, sizeof( int ) * MAX_N * MAX_N ); } multipy1( a, N, N, a, N, N, temp ); memcpy( a, temp, sizeof( int ) * MAX_N * MAX_N ); n /= 2; } memcpy( a, ans, sizeof( int ) * MAX_N * MAX_N );}int main(){ char s[MAX_N]; int a[MAX_N][MAX_N]; int ans[MAX_N][MAX_N]; int temp[MAX_N][MAX_N]; while( scanf( "%d", &M ) != EOF ){ scanf( "%s", s ); N = strlen( s ); memset( a, 0, sizeof( a ) ); a[1][1] = a[1][N] = 1; for( int i = 2; i <= N; i++ ){ a[i][i] = a[i][i-1] = 1; }/* cout << "--------------" << endl; for( int i = 1; i <= N; i++ ){ for( int j = 1; j <= N; j++ ){ cout << a[i][j]; } cout << endl; } cout << "--------------" << endl;*/ get_matrix_pow( a, M );/* cout << "--------------" << endl; for( int i = 1; i <= N; i++ ){ for( int j = 1; j <= N; j++ ){ cout << a[i][j]; } cout << endl; } cout << "--------------" << endl;*/ for( int i = 1; i <= N; i++ ){ ans[i][1] = s[i-1] - '0'; } multipy( a, N, N, ans, N, 1, temp ); for( int i = 1; i <= N; i++ ){ printf( "%c", temp[i][1] + '0' ); } puts(""); } return 0;}
0 0
- hdu 2276 矩阵快速幂&&循环矩阵优化
- HDU 2276 矩阵快速幂,解法:1循环矩阵31ms,2普通矩阵327ms。
- HDU 2276 & FZU 1692 (矩阵快速幂+循环同构优化)
- foj 1692 矩阵快速幂&&循环矩阵优化
- hdu 4291 矩阵快速幂+循环节
- HDU 4291 (矩阵快速幂+循环节)
- hdu 4291(矩阵快速幂 + 循环节)
- hdu 5690 矩阵快速幂/循环节
- hdu 4291(矩阵快速幂+循环节)
- 【矩阵快速幂 && 循环节】HDU
- HDU 5318 (dp+矩阵快速幂优化)
- hdu 2276(矩阵快速幂)
- hdu 2276(矩阵快速幂)
- 矩阵快速幂优化
- hdu 4291 矩阵的快速幂(寻找循环节)
- HDU 4291 A Short problem(矩阵快速幂+循环节)
- HDU 4291 A Short problem // 矩阵快速幂, 循环节
- hdu 4291 矩阵快速幂+找循环节
- hdoj 2504 又见GCD 【GCD判定】
- mac系统下为emacs设置中文字体,解决乱码问题
- [ACM] POJ 1026 Cipher (组合数学,置换)
- sdcard写入文件操作注意
- hpu 练习二 eof不能出现o与o 一起时,确定字母长度,求排列方式
- hdu 2276 矩阵快速幂&&循环矩阵优化
- LINUX基础第六章笔记_1
- 关闭窗体后,进程仍然在运行的问题重现与解决
- CIPAddressCtrl类的使用(IP地址与CString的互相转化)
- 现sdd场sdfsdfsdf直sd播dsfsdlfjdksl
- hpu练习二没看题好像
- hdu 1175 连连看
- 学生信息管理系统错误集(2)
- Copy List with Random Pointer (LeetCode)