矩阵乘法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 10using 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 32using 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 ...
随机推荐
- Oracle 相关概念
注:本文来源于 <腾科OCP培训课堂>.非准许商业活动. 标题:Oracle 相关概念 --->数据库名.实例名.数据库域名.全局数据名.服务名 一:数据库名 1:什么是数据库名 ...
- vue scoped 穿透_vue 修改内部组件样式问题
何为scoped? 在vue文件中的style标签上,有一个特殊的属性:scoped.当一个style标签拥有scoped属性时,它的CSS样式就只能作用于当前的组件,也就是说,该样式只能适用于当前组 ...
- Keepalived详解之 - LVS(IPVS)管理工具ipvsadm使用指南
ipvsadm是什么? ipvsadm是用来配置.维护或者查看Linux内核当中virtual server table的一个工具, LVS(Linux virtual server)能基于一个集群当 ...
- python+selenium二:定位方式
# 八种单数定位方式:elementfrom selenium import webdriverimport time driver = webdriver.Firefox()time.sleep(2 ...
- oracle表分区的,分区操作,分区查询,子分区查询
一.摘要 有关表分区的一些维护性操作: 注:分区根据具体情况选择. 表分区有以下优点: 1.数据查询:数据被存储到多个文件上,减少了I/O负载,查询速度提高. 2.数据修剪:保存历史数据非常的理想. ...
- Codeforces 160D Edges in MST tarjan找桥
Edges in MST 在用克鲁斯卡尔求MST的时候, 每个权值的边分为一类, 然后将每类的图建出来, 那些桥就是必须有的, 不是桥就不是必须有. #include<bits/stdc++.h ...
- “教你如何玩转Web响应式布局” 的更多相关文章
“教你如何玩转Web响应式布局” 的更多相关文章 网址:http://www.360doc.com/relevant/641896074_more.shtml
- 【Java】 剑指offer(7) 二叉树的下一个结点
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? ...
- 通过pyqt5实现俄罗斯方块游戏例子
# *_* coding:utf-8 *_* # 开发团队:中国软件开发团队# 开发人员:Administrator# 开发时间:2019/3/17 2:13# 文件名称:RussiaBoard# 开 ...
- 洛谷 P2440 木材加工【基础二分】
题目链接:https://www.luogu.org/problemnew/show/P2440 题目描述 木材厂有一些原木,现在想把这些木头切割成一些长度相同的小段木头(木头有可能有 剩余),需要得 ...