Time Limit: 3000MS | Memory Limit: 131072K | |
Total Submissions: 1904 | Accepted: 597 |
Description
Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak.
Input
The input contains exactly one test case. The first line of input contains three positive integers n (n ≤ 30), k (k ≤ 109) and m (m < 104). Then follow n lines each containing n nonnegative integers below 32,768, giving A’s elements in row-major order.
Output
Output the elements of S modulo m in the same way as A is given.
Sample Input
2 2 4 0 1 1 1
Sample Output
1 2 2 3
Source
- #include <iostream>
- #include <string>
- using namespace std;
- int n, m;
- struct multiply {
- int a[31][62];
- multiply operator*(const multiply & l) {
- multiply temp;
- int i, j, k;
- memset(temp.a, 0, sizeof (temp.a));
- for (i = 0; i < n; i++)
- for (j = 0; j < n; j++)
- for (k = 0; k < n; k++)
- temp.a[i][j] = (temp.a[i][j] + a[i][k] * l.a[k][j]) % m;
- for (i = 0; i < n; i++)
- for (j = n; j < 2 * n; j++) {
- temp.a[i][j] = (temp.a[i][j] + l.a[i][j]) % m;
- for (k = 0; k < n; k++)
- temp.a[i][j] = (temp.a[i][j] + l.a[i][k] * a[k][j]) % m;
- }
- return temp;
- }
- } K;
- multiply pow(multiply & t, int k) {
- multiply temp;
- if (k == 1) return t;
- temp = t * t;
- if (k & 1) return pow(temp, k / 2) * t;
- else return pow(temp, k / 2);
- }
- int main() {
- multiply ss;
- int k, i, j;
- scanf("%d%d%d", &n, &k, &m);
- for (i = 0; i < n; i++) {
- for (j = 0; j < n; j++) {
- scanf("%d", &K.a[i][j]);
- }
- }
- for (i = 0, j = n; i < n; i++, j++) {
- K.a[i][j] = 1;
- }
- ss = pow(K, k + 1);
- for (i = 0, j = n; i < n; i++, j++) {
- ss.a[i][j]--;
- }
- for (i = 0; i < n; i++) {
- for (j = n; j < 2 * n - 1; j++)
- printf("%d ", ss.a[i][j] % m);
- printf("%d/n", ss.a[i][j] % m);
- }
- return 0;
- }
Time: 141MS
Memory: 1104K
===============================================================================================
学习到了原来二分是好东东的说-_____________-
这里附上自己的代码,感受到了和大牛的差距也...
T.T偶500+MS啊,差距也....
- #include <iostream>
- using namespace std;
- #define MAX_SIZE 30
- int moudle,k,size;
- struct Mat
- {
- long long g[MAX_SIZE][MAX_SIZE];
- Mat operator+(const Mat&a)
- {
- Mat temp;
- int i,j;
- for(i=0;i<size;i++)
- for(j=0;j<size;j++)
- temp.g[i][j]=(g[i][j]+a.g[i][j])%moudle;
- return temp;
- }
- Mat operator*(const Mat&a)
- {
- Mat temp;
- int i,j,k;
- for(i=0;i<size;i++)
- for(j=0;j<size;j++)
- {
- temp.g[i][j]=0;
- for(k=0;k<size;k++)
- temp.g[i][j]+=g[i][k]*a.g[k][j];
- if(temp.g[i][j]>=moudle)
- temp.g[i][j]%=moudle;
- }
- return temp;
- }
- }A,S;
- Mat pow(int _k,Mat g)
- {
- Mat temp;
- int i,j;
- for(i=0;i<size;i++)for(j=0;j<size;j++)if(i!=j)temp.g[i][j]=0;else temp.g[i][j]=1;
- for(;_k;g=g*g,_k>>=1)
- if(_k&1)temp=temp*g;
- return temp;
- }
- Mat sum(int _k)
- {
- if(_k==1) return A;
- Mat temp,tpow;
- temp=sum(_k/2);
- if(_k&1)
- temp=temp+temp*(tpow=pow(_k/2+1,A))+tpow;
- else
- temp=temp+pow(_k/2,A)*temp;
- return temp;
- }
- int main()
- {
- int i,j;
- scanf("%d%d%d",&size,&k,&moudle);
- for(i=0;i<size;i++)
- for(j=0;j<size;j++)
- scanf("%d",&A.g[i][j]);
- S=sum(k);
- for(i=0;i<size;i++)
- {
- for(j=0;j<size-1;j++)
- printf("%d ",S.g[i][j]);
- printf("%d/n",S.g[i][size-1]);
- }
- return 0;
- }