矩阵乘法code
VOJ1067
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
#include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 10 using namespace std; const int mod = 7777777; typedef long long LL; struct matrix{ LL a[10][10]; }origin; int n,m; matrix multiply(matrix x,matrix y) { matrix temp; memset (temp.a,0, sizeof (temp.a)); for ( int i=0;i<n;i++) { for ( int j=0;j<n;j++) { for ( int k=0;k<n;k++) { temp.a[i][j]+=x.a[i][k]*y.a[k][j]; temp.a[i][j]=(temp.a[i][j])%mod; } } } return temp; } matrix matmod(matrix A, int k) { matrix res; memset (res.a,0, sizeof res.a); for ( int i=0;i<n;i++) res.a[i][i]=1; while (k) { if (k&1) res=multiply(res,A); k>>=1; A=multiply(A,A); } return res; } void print(matrix x) { for ( int i=0;i<n;i++) { for ( int j=0;j<n;j++) cout<< " " <<x.a[i][j]; puts ( "" ); } printf ( "---------------\n" ); } int main() { int k; while (cin>>n>>k) { memset (origin.a,0, sizeof origin.a); origin.a[0][0]=1; for ( int i=1;i<=n;i++) { origin.a[i][0]=1; for ( int j=0;j<i;j++) origin.a[i][0]+=origin.a[j][0]; } // print(origin); matrix res; memset (res.a,0, sizeof res.a); for ( int i=0;i<n-1;i++) res.a[i][i+1]=1; for ( int i=0;i<n;i++) res.a[n-1][i]=1; //print(res); res=matmod(res,k-1); LL fans=0; for ( int i=0;i<n;i++) { fans+=res.a[0][i]*origin.a[i][0]; fans%=mod; } cout<<fans<<endl; } return 0; } |
经典题目9
经典题目10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
#include <cstdio> #define SIZE (1<<m) #define MAX_SIZE 32 using namespace std; class CMatrix { public : long element[MAX_SIZE][MAX_SIZE]; void setSize( int ); void setModulo( int ); CMatrix operator* (CMatrix); CMatrix power( int ); private : int size; long modulo; }; void CMatrix::setSize( int a) { for ( int i=0; i<a; i++) for ( int j=0; j<a; j++) element[i][j]=0; size = a; } void CMatrix::setModulo( int a) { modulo = a; } CMatrix CMatrix::operator* (CMatrix param) { CMatrix product; product.setSize(size); product.setModulo(modulo); for ( int i=0; i<size; i++) for ( int j=0; j<size; j++) for ( int k=0; k<size; k++) { product.element[i][j]+=element[i][k]*param.element[k][j]; product.element[i][j]%=modulo; } return product; } CMatrix CMatrix::power( int exp ) { CMatrix tmp=(* this )*(* this ); if ( exp ==1) return * this ; else if ( exp &1) return tmp.power( exp /2)*(* this ); else return tmp.power( exp /2); } int main() { const int validSet[]={0,3,6,12,15,24,27,30}; long n, m, p; CMatrix unit; scanf ( "%d%d%d" , &n, &m, &p); unit.setSize(SIZE); for ( int i=0; i<SIZE; i++) for ( int j=0; j<SIZE; j++) if (((~i)&j) == ((~i)&(SIZE-1))) { bool isValid= false ; for ( int k=0;k<8;k++) isValid=isValid||(i&j)==validSet[k]; unit.element[i][j]=isValid; } unit.setModulo(p); printf ( "%d" ,unit.power(n).element[SIZE-1][SIZE-1] ); return 0; } |
矩阵乘法例题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; static const int maxm=1e2+10; #define REP(i,s,t) for(int i=s;i<=t;i++) typedef long long LL; struct matrix{ LL mtx[maxm][maxm]; }mx[16]; LL n,k,m; LL A[maxm][maxm]; matrix mul(matrix A,matrix B){ matrix ret; memset (ret.mtx,0, sizeof ret.mtx); REP(i,1,n)REP(j,1,n)REP(k,1,n) ret.mtx[i][j]=(ret.mtx[i][j]+A.mtx[i][k]*B.mtx[k][j]); return ret; } matrix pow (matrix A,LL n){ if (!n) return A; matrix ret=A;n--; while (n){ if (n&1)ret=mul(ret,A); A=mul(A,A); n>>=1; } return ret; } void display(matrix base){ for ( int i=1;i<=n;i++) printf ( "%lld " ,base.mtx[1][i]); puts ( "" ); } int main(){ matrix st,get,f; scanf ( "%lld%lld%lld" ,&n,&m,&k); for ( int i=1;i<=m;i++){ for ( int j=1;j<=n;j++){ scanf ( "%lld" ,&A[i][j]); mx[i].mtx[A[i][j]][j]=1; } } for ( int i=1;i<=n;i++)st.mtx[1][i]=i; get=mx[1]; for ( int i=2;i<=m;i++)get=mul(get,mx[i]); get= pow (get,k/m);k%=m; for ( int i=1;i<=k;i++)get=mul(get,mx[i]); st=mul(st,get); display(st); return 0; } //by Exbilar |
矩阵乘法code的更多相关文章
- [HNOI2008]GT考试(kmp,dp,矩阵乘法)
[HNOI2008]GT考试(luogu) Description 求有多少个n位的数字串不包含m位的字符串(范围 n <= 1e9 n<=1e9, m <= 20m<=20) ...
- 【BZOJ-2476】战场的数目 矩阵乘法 + 递推
2476: 战场的数目 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 58 Solved: 38[Submit][Status][Discuss] D ...
- 【BZOJ-1898】Swamp 沼泽鳄鱼 矩阵乘法
1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1012 Solved: 566[Submit][S ...
- 【Codeforces718C】Sasha and Array 线段树 + 矩阵乘法
C. Sasha and Array time limit per test:5 seconds memory limit per test:256 megabytes input:standard ...
- 【BZOJ-4547】小奇的集合 矩阵乘法 + 递推
4547: Hdu5171 小奇的集合 Time Limit: 2 Sec Memory Limit: 256 MBSubmit: 175 Solved: 85[Submit][Status][D ...
- 【BZOJ-4386】Wycieczki DP + 矩阵乘法
4386: [POI2015]Wycieczki Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 197 Solved: 49[Submit][Sta ...
- 华为OJ平台——矩阵乘法
题目描述: 如果A是个x行y列的矩阵,B是个y行z列的矩阵,把A和B相乘,其结果将是另一个x行z列的矩阵C. 输入: 1.第一个矩阵的行数 2.第一个矩阵的列数(也是第二个矩阵的行数) 3.第二个矩阵 ...
- 2.3CUDA矩阵乘法
CPU 矩阵乘法 能相乘的两个矩阵,必须满足一个矩阵的行数和第二个矩阵的列数相同. A(N*P) * B(P*M) = C(N*M). 其中P是行数,N是列数, 从宽高的角度来说,即 A的宽度和B的高 ...
- 【POJ2778】AC自动机+矩阵乘法
DNA Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14758 Accepted: 5716 Descrip ...
随机推荐
- php 中使用include、require、include_once、require_once的区别
在PHP中,我们经常会通过include.require.include_once.require_once来引用文件,都可以达到引用文件的目的,但他们之间又有哪些区别呢,接一下我们详细的介绍一下 i ...
- Java集合(Collection)综述
1.集合简介 数学定义:一般地,我们把研究对象统称为元素.把一些元素组成的总体叫做集合. java集合定义:集合就是一个放数据的容器,准确的说是放数据对象引用的容器. java中通用集合类存放于jav ...
- Laravel Form 表单的数据校验
例如,要使用手机号加验证码的方式提供登录网站的功能,那么在处理前端提交的 form 表单时,就不得不对提交的手机号及验证码做基本的数据校验. 手写规则,非常浪费时间.使用 laravel 内置的 va ...
- php正则表达式验证(邮件地址、Url地址、电话号码、邮政编码)
1.电子邮件地址的校验 <?php /* 校验邮件地址*/ function checkMail($email) { //用户名,由“w”格式字符.“-”或“.”组成 $email_name= ...
- cf220B莫队
用莫队比直接做快了很多.. #include<iostream> #include<cstring> #include<cstdio> #include<cm ...
- bzoj营业额统计
这个也是板子题吧,很水,求前驱后继即可 /* 插入,求前驱和后继 */ #include<iostream> #include<cstring> #include<cst ...
- Fiddler抓包9-保存会话(save)
前言 为什么要保存会话呢?举个很简单的场景,你在上海测试某个功能接口的时候,发现了一个BUG,而开发这个接口的开发人员是北京的一家合作公司.你这时候给对方开发提bug, 如何显得专业一点,能让对方心服 ...
- BBC记录片之非洲4
- Python中包(package)的调用方式
一.什么是Python Package 如何区分你看到的目录是一个Python Package包呢?其实很简单,你只要看这个名录下是否有“__init__.py”这个文件就好了,如果有那么就是Pyt ...
- Hibernate之一级缓存和二级缓存
1:Hibernate的一级缓存: 1.1:使用一级缓存的目的是为了减少对数据库的访问次数,从而提升hibernate的执行效率:(当执行一次查询操作的时候,执行第二次查询操作,先检查缓存中是否有数据 ...