poj——3233(数论之矩阵快速幂)
2013-08-12 15:10
253 查看
题目地址:http://poj.org/problem?id=3233
解析:思想基本和单纯数的快速幂一样。#include <iostream>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
typedef long long ll;
#define INF 0xfffffff
#define MAX(a,b) a>b?a:b
#define MIN(a,b) a>b?b:a
#define N 50
int n,MOD;
typedef struct
{
int m
;
}matrax;
matrax a,per; //a为原始矩阵,per为单位阵
void init()
{
int i,j;
memset(per.m,0,sizeof(per.m));
for(i=0;i<n;i++)
per.m[i][i]=1;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
cin>>a.m[i][j];
a.m[i][j]%=MOD;
}
}
matrax matrax_add(matrax b, matrax c) //矩阵加法。
{
matrax temp;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
temp.m[i][j]=(b.m[i][j]+c.m[i][j])%MOD;
return temp;
}
matrax matrax_mul(matrax b, matrax c)
{
matrax temp;
int mid;
int i,j,k;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
mid=0;
for(k=0;k<n;k++)
mid=(mid+b.m[i][k]*c.m[k][j])%MOD;
temp.m[i][j]=mid;
}
return temp;
}
matrax matrax_pow(int k)
{
matrax p,ans=per;//开始为单位阵
p=a;
while(k)
{
if(k&1)
{
ans=matrax_mul(ans,p); //p起到权的作用
k--;
}
else
{
p=matrax_mul(p,p);
k/=2;
}
}
return ans;
}
matrax matrax_sum(int k)
{
if(k==1) return a;
matrax temp,b;
temp=matrax_sum(k/2); //二分,由前k/2部分可以直接推出后k/2部分,分奇偶讨论
if(k&1) //中间为奇数的情况
{
b=matrax_pow(k/2+1);
temp=matrax_add(temp,matrax_mul(temp,b));
temp=matrax_add(temp,b);
}
else
{
b=matrax_pow(k/2);
temp=matrax_add(temp,matrax_mul(temp,b));
}
return temp;
}
int main()
{
int i,j,k,t;
while(cin>>n>>k>>MOD)
{
init();
matrax temp=matrax_sum(k);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
cout<<temp.m[i][j]<<" ";
cout<<endl;
}
}
return 0;
}
解析:思想基本和单纯数的快速幂一样。#include <iostream>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
typedef long long ll;
#define INF 0xfffffff
#define MAX(a,b) a>b?a:b
#define MIN(a,b) a>b?b:a
#define N 50
int n,MOD;
typedef struct
{
int m
;
}matrax;
matrax a,per; //a为原始矩阵,per为单位阵
void init()
{
int i,j;
memset(per.m,0,sizeof(per.m));
for(i=0;i<n;i++)
per.m[i][i]=1;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
cin>>a.m[i][j];
a.m[i][j]%=MOD;
}
}
matrax matrax_add(matrax b, matrax c) //矩阵加法。
{
matrax temp;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
temp.m[i][j]=(b.m[i][j]+c.m[i][j])%MOD;
return temp;
}
matrax matrax_mul(matrax b, matrax c)
{
matrax temp;
int mid;
int i,j,k;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
mid=0;
for(k=0;k<n;k++)
mid=(mid+b.m[i][k]*c.m[k][j])%MOD;
temp.m[i][j]=mid;
}
return temp;
}
matrax matrax_pow(int k)
{
matrax p,ans=per;//开始为单位阵
p=a;
while(k)
{
if(k&1)
{
ans=matrax_mul(ans,p); //p起到权的作用
k--;
}
else
{
p=matrax_mul(p,p);
k/=2;
}
}
return ans;
}
matrax matrax_sum(int k)
{
if(k==1) return a;
matrax temp,b;
temp=matrax_sum(k/2); //二分,由前k/2部分可以直接推出后k/2部分,分奇偶讨论
if(k&1) //中间为奇数的情况
{
b=matrax_pow(k/2+1);
temp=matrax_add(temp,matrax_mul(temp,b));
temp=matrax_add(temp,b);
}
else
{
b=matrax_pow(k/2);
temp=matrax_add(temp,matrax_mul(temp,b));
}
return temp;
}
int main()
{
int i,j,k,t;
while(cin>>n>>k>>MOD)
{
init();
matrax temp=matrax_sum(k);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
cout<<temp.m[i][j]<<" ";
cout<<endl;
}
}
return 0;
}
相关文章推荐
- POJ 3233 Matrix Power Series [矩阵快速幂]【数论】[水]
- 数论 快速矩阵幂 POJ 3233 Matrix Power Series 二分和
- POJ 3233 Matrix Power Series (矩阵快速幂+二分)
- POJ 3233 Matrix Power Series 【矩阵快速幂,矩阵加速】
- 矩阵快速幂 HDU 2157 HDU 5015 POJ 3233
- POJ 3233 矩阵快速幂&二分
- POJ-3233 Matrix Power Series(矩阵快速幂)
- poj-3233 Matrix Power Series(矩阵快速幂)
- Poj 3233 矩阵快速幂,暑假训练专题中的某一道题目,矩阵快速幂的模板
- POJ 3233 Matrix Power Series (矩阵快速幂)
- poj 3233 Matrix Power Series(矩阵快速幂)
- poj 3233 矩阵快速幂
- POJ 3233 - Matrix Power Series(矩阵快速幂)
- poj 3233 Matrix Power Series 矩阵快速幂
- [POJ 3233] Matrix Power Series (矩阵快速幂)
- poj 3233 Matrix Power Series---矩阵快速幂
- 【POJ 3233】矩阵快速幂+二分求等比数列前N项和
- POJ 3233 矩阵快速幂
- POJ 3233 Matrix Power Series(矩阵快速幂)
- POJ 3070 Fibonacci【矩阵快速幂】【感受数论的神奇】