FZU1683 矩阵

  1 //Accepted    220 KB    359 ms
  2 #include <cstdio>
  3 #include <cstring>
  4 const int maxn=5;
  5 int pp;
  6 struct matrix
  7 {
  8     //矩阵m*n
  9     //(0,0)..(m-1,n-1)
 10     int a[maxn][maxn];
 11     int m,n;
 12     matrix()
 13     {
 14         memset(a,0,sizeof(a));
 15         m=n=0;
 16     }
 17     matrix operator+(matrix mymatrix)
 18     {
 19         matrix m_matrix;
 20         int i,j;
 21         for (i=0;i<m;i++)
 22         for (j=0;j<n;j++)
 23         m_matrix.a[i][j]=(a[i][j]+mymatrix.a[i][j])%pp;
 24         m_matrix.m=m;
 25         m_matrix.n=n;
 26         return m_matrix;
 27     }
 28     matrix operator*(matrix mymatrix)
 29     {
 30         matrix m_matrix;
 31         int i,j,k;
 32         for (i=0;i<m;i++)
 33         {
 34             for (j=0;j<n;j++)
 35             {
 36                 if (a[i][j])
 37                 for (k=0;k<mymatrix.n;k++)
 38                 m_matrix.a[i][k]=(m_matrix.a[i][k]+a[i][j]*mymatrix.a[j][k])%pp;
 39             }
 40         }
 41         m_matrix.m=m;
 42         m_matrix.n=mymatrix.n;
 43         return m_matrix;
 44     }
 45     //A^k
 46     matrix getp(int k)
 47     {
 48         matrix d,c;
 49         if (k==1) return *this;
 50         if (k==2) return (*this)*(*this);
 51         d=getp(k/2);
 52         if (k%2==0) return d*d;
 53         else
 54         return d*d*(*this);
 55     }
 56     //A+A^2+A^3+..+A^k
 57     matrix sump(int k)
 58     {
 59         matrix d,c;
 60         if (k==1) return *this;
 61         if (k==2) return (*this)+(*this)*(*this);
 62         d=sump(k/2);
 63         if (k%2==0)
 64         {
 65             return d+d*getp(k/2);
 66         }
 67         else
 68         return d+d*getp(k/2)+getp(k);
 69     }
 70     void output()
 71     {
 72         int i,j;
 73         for (i=0;i<m;i++)
 74         {
 75             for (j=0;j<n;j++)
 76             printf("%d ",a[i][j]%pp);
 77             printf("\n");
 78         }
 79     }
 80     void input()
 81     {
 82         for (int i=0;i<m;i++)
 83         {
 84             for (int j=0;j<n;j++)
 85             {
 86                 scanf("%d",&a[i][j]);
 87             }
 88         }
 89     }
 90 };
 91 int n;
 92 int k;
 93 matrix tr,mtr;
 94 int main()
 95 {
 96     pp=2009;
 97     int T;
 98     scanf("%d",&T);
 99     for (int t=1;t<=T;t++)
100     {
101         scanf("%d",&n);
102         printf("Case %d: ",t);
103         if (n<3)
104         {
105             if (n==0) printf("1\n");
106             if (n==1) printf("4\n");
107             if (n==2) printf("9\n");
108             continue ;
109         }
110         tr.m=tr.n=4;
111         tr.a[0][0]=1;
112         tr.a[0][1]=tr.a[0][2]=tr.a[0][3]=0;
113         tr.a[1][0]=1;
114         tr.a[1][1]=3;
115         tr.a[1][2]=1;
116         tr.a[1][3]=0;
117         tr.a[2][0]=0;
118         tr.a[2][1]=2;
119         tr.a[2][2]=0;
120         tr.a[2][3]=1;
121         tr.a[3][0]=0;
122         tr.a[3][1]=7;
123         tr.a[3][2]=0;
124         tr.a[3][3]=0;
125         tr=tr.getp(n-1);
126         mtr.m=1;
127         mtr.n=4;
128         mtr.a[0][0]=4;
129         mtr.a[0][1]=5;
130         mtr.a[0][2]=3;
131         mtr.a[0][3]=1;
132         tr=mtr*tr;
133         printf("%d\n",tr.a[0][0]);
134     }
135     return 0;
136 }

时间: 2024-07-31 15:02:50

FZU1683 矩阵的相关文章

矩阵快速幂大合集

hdu1757: Description Lele now is thinking about a simple function f(x). If x < 10 f(x) = x. If x >= 10 f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + -- + a9 * f(x-10); And ai(0<=i<=9) can only be 0 or 1 . Now, I will give a0 ~ a9 and two po

矩阵乘法的Strassen算法详解

题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数和另一个矩阵A的行数相等时才能定义.如A是m×n矩阵和B是n×p矩阵,它们的乘积AB是一个m×p矩阵,它的一个元素其中 1 ≤ i ≤ m, 1 ≤ j ≤ p. 值得一提的是,矩阵乘法满足结合律和分配率,但并不满足交换律,如下图所示的这个例子,两个矩阵交换相乘后,结果变了: 下面咱们来具体解决这个矩阵相乘的问题. 解法一.暴力解法 其实,通过前面的分析

*C#(WPF)--矩阵拖动和矩阵动画(拖动展开,不足动画效果)

最近在研发新的项目,遇到了一个桌面模式下的难点--展开动画.之前动画这方面没做过,也许很多人开始做的时候也会遇到相关问题,因此我把几个重点及实际效果图总结展示出来: 我的开发环境是在VS2017下进行的,这个工具条主要功能是:一个工具条,可进行拖拉.可进行拖拉展开,可在拖动之后不足展开并反向继续展开剩下的部分: 一.[拖动]   拖动的核心代码是通过矩阵进行定位和拖动的,定位是以父容器为模板的.以下是核心代码(及效果图): 1 /// <summary> 2 /// 这里TitleBar代指最

矩阵快速幂刷题系列

来源自http://blog.csdn.net/chenguolinblog/article/details/10309423 hdu 1575 Tr A Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5587    Accepted Submission(s): 4200 Problem Description A为一个方阵,则Tr

51nod 1137 矩阵乘法

基本的矩阵乘法 中间for(int j=0;i<n;i++)  //这里写错了   应该是j<n 晚上果然  效率不行 等会早点儿睡 //矩阵乘法 就是 两个矩阵 第一个矩阵的列 等与 第二个矩阵的行相同 // 然后ans[i][j] += a[i][k] * b[k][j]; #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 150; int n; ll a[ma

2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6155 Subsequence Count 矩阵快速幂

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6155 题意: 题解来自:http://www.cnblogs.com/iRedBean/p/7398272.html 先考虑dp求01串的不同子序列的个数. dp[i][j]表示用前i个字符组成的以j为结尾的01串个数. 如果第i个字符为0,则dp[i][0] = dp[i-1][1] + dp[i-1][0] + 1,dp[i][1] = dp[i-1][1] 如果第i个字符为1,则dp[i][1

POJ3233 构造子矩阵+矩阵快速幂

题意:给你矩阵A,求S=A+A^1+A^2+...+A^n sol:直接把每一项解出来显然是不行的,也没必要. 我们可以YY一个矩阵: 其中1表示单位矩阵 然后容易得到: 可以看出这个分块矩阵的左下角那块就可以得到要求的解S 我们取这一块,再减去一个单位矩阵1即可. 为了保持右下角一直是1,所以右上的位置必须是0,由于需要不断移位,所以1是必要的,A是必要的,所以第一列保证移位, 第二列保证保留1,因此我们能成功构造出.... 这个题还可以根据等比矩阵的性质来进行求解...后面补(x

矩阵乘法

矩阵加法就是相同位置的数字加一下,矩阵减法也类似 矩阵乘以一个常数,就是所有位置都乘以这个数 矩阵乘以矩阵 计算规则是,第一个矩阵第一行的每个数字(2和1),各自乘以第二个矩阵第一列对应位置的数字(1和1),然后将乘积相加( 2 x 1 + 1 x 1),得到结果矩阵左上角的那个值3 矩阵的本质就是线性方程式,两者是一一对应关系.如果从线性方程式的角度,理解矩阵乘法就毫无难度.下面是一组线性方程式 矩阵的最初目的,只是为线性方程组提供一个简写形式 下面是严格的证明.有三组未知数 x.y 和 t,

hdu 5015 233 Matrix (矩阵快速幂)

题意: 有一种矩阵,它的第一行是这样一些数:a  0,0 = 0, a 0,1 = 233,a 0,2 = 2333,a 0,3 = 23333... 除此之外,在这个矩阵里, 我们有 a i,j = a i-1,j +a i,j-1( i,j ≠ 0).现在给你 a 1,0,a 2,0,...,a n,0, 你能告诉我a n,m 是多少吗? n,m(n ≤ 10,m ≤ 10 9)输出 a n,m mod 10000007. 思路:首先我们观察n和m的取值范围,会发现n非常小而m却非常大,如果