您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: