您的位置:首页 > 其它

POJ 2118 矩阵乘法

2012-10-10 21:54 232 查看
题意:

an=Σ1<=i<=k (an-i*bi) mod 10000

分析:

典型的矩阵乘法解线性递推式~

无限YM MATRIX67神犇~

http://www.matrix67.com/blog/archives/276/comment-page-1#comment-223435

View Code

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>

#define SIZE 110
#define mod 10000

using namespace std;

int n,m,a[SIZE],b[SIZE];

struct MT
{
int x,y;
int mt[SIZE][SIZE];
}ans,def;

inline MT operator *(MT a,MT b)
{
MT c;
memset(c.mt,0,sizeof c.mt);
c.x=a.x; c.y=b.y;
for(int i=1;i<=a.x;i++)
for(int j=1;j<=b.y;j++)
for(int k=1;k<=b.x;k++)
c.mt[i][j]=(c.mt[i][j]+(a.mt[i][k]%mod)*(b.mt[k][j]%mod))%mod;
return c;
}

bool read()
{
for(int i=0;i<n;i++) scanf("%d",&a[i]);
for(int i=0;i<n;i++) scanf("%d",&b[i]);
scanf("%d",&m);
if(m<=n-1) {printf("%d\n",a[m]);return false;}
m=m-(n-1);
for(int i=1;i<=n;i++) ans.mt[i][1]=a[i-1];
ans.x=n; ans.y=1;
memset(def.mt,0,sizeof def.mt);
for(int i=1;i<n;i++) def.mt[i][i+1]=1;
for(int i=1;i<=n;i++) def.mt
[i]=b[n-i];
def.x=def.y=n;
return true;
}

void go()
{
while(m)
{
if(m&1) ans=def*ans;
def=def*def;
m>>=1;
}
printf("%d\n",ans.mt
[1]);
}

int main()
{
while(scanf("%d",&n),n)
{
if(!read()) continue;
else go();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: