2017 ECJTU ACM程序设计竞赛 矩阵快速幂+二分

矩阵

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 7   Accepted Submission(s) : 4

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

假设你有一个矩阵,有这样的运算A^(n+1) = A^(n)*A (*代表矩阵乘法)
现在已知一个n*n矩阵A,S = A+A^2+A^3+...+A^k,输出S,因为每一个元素太大了,输出的每个元素模10

Input

先输入一个T(T<=10),每组一个n,k(1<=n<=30, k<=1000000)

Output

输出一个矩阵,每个元素模10(行末尾没有多余空格)

Sample Input

1
3 2
0 2 0
0 0 2
0 0 0

Sample Output

0 2 4
0 0 2
0 0 0

矩阵快速幂 + 等比数列二分求和AC
 1 #include <cstdio>
 2 #include <cmath>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <iostream>
 6 #include <sstream>
 7 #include <algorithm>
 8 #include <string>
 9 #include <queue>
10 #include <vector>
11 using namespace std;
12 const int maxn= 1e5+10;
13 const double eps= 1e-6;
14 const int inf = 0x3f3f3f3f;
15 const int mod =10;
16 typedef long long ll;
17 int n,m;
18 struct matrix
19 {
20     int m[35][35];
21     matrix()
22     {
23         memset(m,0,sizeof(m));
24     }
25 };
26 matrix operator *(const matrix &a,const matrix &b)
27 {
28     matrix c;
29     for(int i=1;i<=n;i++)
30         for(int j=1;j<=n;j++)
31         {
32             c.m[i][j]=0;
33             for(int k=1;k<=n;k++)
34                 c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])%mod;
35         }
36         return c;
37 }
38 matrix quick(matrix base,int pow)
39 {
40     matrix a;
41     for(int i=1;i<=n;i++) a.m[i][i]=1;
42     while(pow)
43     {
44         if(pow&1) a=a*base;
45         base=base*base;
46         pow>>=1;
47     }
48     return a;
49 }
50 matrix sum(matrix a,matrix b)
51 {
52     for(int j=1;j<=n;j++)
53         for(int k=1;k<=n;k++)
54             a.m[j][k]=(a.m[j][k]+b.m[j][k])%mod;
55     return a;
56 }
57 matrix solve(matrix x,int y)
58 {
59     matrix a,s;
60     if(y==1)
61         return x;
62     a=solve(x,y/2);
63     s=sum(a,a*quick(x,y/2));
64     if(y&1)
65         s=sum(s,quick(x,y));
66     return s;
67 }
68 int main()
69 {
70     int t;
71     scanf("%d",&t);
72     while(t--)
73     {
74         scanf("%d %d",&n,&m);
75         matrix  a;
76         for(int i=1;i<=n;i++)
77             for(int j=1;j<=n;j++)
78                 scanf("%d",&a.m[i][j]);
79         matrix ans=solve(a,m);
80         for(int i=1;i<=n;i++)
81         {
82             for(int j=1;j<=n;j++)
83             {
84                 if(j==n)
85                     printf("%d\n",ans.m[i][j]);
86                 else
87                     printf("%d ",ans.m[i][j]);
88             }
89         }
90
91     }
92 }
时间: 2024-10-12 03:01:08

2017 ECJTU ACM程序设计竞赛 矩阵快速幂+二分的相关文章

2017 ECJTU ACM 程序设计竞赛

大厦 Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submission(s) : 25   Accepted Submission(s) : 7 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description 给你一个n(1<=n<=1000)层楼的大厦,每一楼里面有m(1&l

华南师大 2017 年 ACM 程序设计竞赛新生初赛题解

华南师大 2017 年 ACM 程序设计竞赛新生初赛题解 华南师范大学第很多届 ACM 程序设计竞赛新生赛(初赛)在 2017 年 11 月 20 日 - 27 日成功举行,共有 146 名同学有效参赛(做出 1 题).进入决赛的资格初定为完成并通过 5 题或以上,决赛时间是 12 月 3 日,地点未定. 题解 被你们虐了千百遍的题目和 OJ 也很累的,也想要休息,所以你们别想了,行行好放过它们,我们来看题解吧... A. 诡异的计数法 Description cgy 太喜欢质数了以至于他计数也

HDU 1588 Gauss Fibonacci(矩阵快速幂+二分等比序列求和)

HDU 1588 Gauss Fibonacci(矩阵快速幂+二分等比序列求和) ACM 题目地址:HDU 1588 Gauss Fibonacci 题意: g(i)=k*i+b;i为变量. 给出k,b,n,M,问( f(g(0)) + f(g(1)) + ... + f(g(n)) ) % M的值. 分析: 把斐波那契的矩阵带进去,会发现这个是个等比序列. 推倒: S(g(i)) = F(b) + F(b+k) + F(b+2k) + .... + F(b+nk) // 设 A = {1,1,

HDU 2254 奥运(矩阵快速幂+二分等比序列求和)

HDU 2254 奥运(矩阵快速幂+二分等比序列求和) ACM 题目地址:HDU 2254 奥运 题意: 中问题不解释. 分析: 根据floyd的算法,矩阵的k次方表示这个矩阵走了k步. 所以k天后就算矩阵的k次方. 这样就变成:初始矩阵的^[t1,t2]这个区间内的v[v1][v2]的和. 所以就是二分等比序列求和上场的时候了. 跟HDU 1588 Gauss Fibonacci的算法一样. 代码: /* * Author: illuz <iilluzen[at]gmail.com> * B

POJ 3233 - Matrix Power Series ( 矩阵快速幂 + 二分)

POJ 3233 - Matrix Power Series ( 矩阵快速幂 + 二分) #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long LL; #define MAX_SIZE 30 #define CLR( a, b ) memset( a, b, sizeof(a) ) int MOD = 0; int n, k; st

HDU - 1588 Gauss Fibonacci (矩阵快速幂+二分求等比数列和)

Description Without expecting, Angel replied quickly.She says: "I'v heard that you'r a very clever boy. So if you wanna me be your GF, you should solve the problem called GF~. " How good an opportunity that Gardon can not give up! The "Prob

POJ 3233 Matrix Power Series 矩阵快速幂+二分求和

矩阵快速幂,请参照模板 http://www.cnblogs.com/pach/p/5978475.html 直接sum=A+A2+A3...+Ak这样累加肯定会超时,但是 sum=A+A2+...+Ak/2+A(k/2)*(A+A2+...+Ak/2)    k为偶数时: sum=A+A2+...+A(k-1)/2+A((k-1)/2)*(A+A2+...+A(k-1)/2)+Ak    k为奇数时. 然后递归二分求和 PS:刚开始mat定义的是__int64,于是贡献了n次TLE... #i

POJ3233:Matrix Power Series(矩阵快速幂+二分)

http://poj.org/problem?id=3233 题目大意:给定矩阵A,求A + A^2 + A^3 + … + A^k的结果(两个矩阵相加就是对应位置分别相加).输出的数据mod m.k<=10^9.这道题两次二分,相当经典.首先我们知道,A^i可以二分求出.然后我们需要对整个题目的数据规模k进行二分.比如,当k=6时,有:A + A^2 + A^3 + A^4 + A^5 + A^6 =(A + A^2 + A^3) + A^3*(A + A^2 + A^3)应用这个式子后,规模

hdu1588 Gauss Fibonacci(矩阵快速幂+二分求矩阵等比和)

题目: Gauss Fibonacci Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2858    Accepted Submission(s): 1186 Problem Description Without expecting, Angel replied quickly.She says: "I'v heard that y