hdu 1757 矩阵连乘
先看看快速冪
?
int t,r,n;
void liu(int n)
{
???????? if(n==1) {r=t;return;}
???????? liu(n/2); ?//遞歸求出 n/2 冪
r*=r;???? //
???????? if(n%2==1) r*=t; //判斷奇、偶
}
?
矩陣連乘:
?
If x >= 10
f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10);
?
?
?
?
?
(f(n),f(n-1),….,f(n-9))=(f(9),….f(0))* 矩陣 的n-9 次方
?
Hdu 1757
?
?
#include<stdio.h>
#include<string.h>
int i,j,k,n,m;
int t[10][10],r[10][10],b[10][10];
void ju(int c[10][10],int d[10][10])
{
?? memset(b,0,sizeof(b));
?? for(i=0;i<10;i++)
?????? for(j=0;j<10;j++)
?????????? for(k=0;k<10;k++) b[i][j]+=c[i][k]*d[k][j]%m;
?? for(i=0;i<10;i++)
?????? for(j=0;j<10;j++) c[i][j]=b[i][j]%m;
}
void liu(int n)
{
?? if(n==1) return;
?? liu(n/2);ju(r,r);
?? if(n&1) ju(r,t);
}
void main()
{
?? memset(t,0,sizeof(t));
?? for(i=0;i<9;i++) t[i][1+i]=1;
?? //for(i=0;i<9;) t[i][++i]=1; //不知道為什么用這個循環的時候就wa,求高手指教
?? while(scanf("%d%d",&n,&m)!=EOF)
?? {
????? if(n<10) {printf("%d\n",n%m);continue;}
????? for(i=0;i<10;i++) scanf("%d",&t[i][0]);
????? memcpy(r,t,sizeof(r));
????? liu(n-9);
????? for(i=n=0;i<9;i++) n+=(9-i)*r[i][0]%m;? //注意這里是 9-i
????? printf("%d\n",n%m);
?? }
}
轉載于:https://www.cnblogs.com/jufu/archive/2012/03/25/2416294.html
總結
以上是生活随笔為你收集整理的hdu 1757 矩阵连乘的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二、Get和Post的区别
- 下一篇: 《JavaScript 每周导读》【第一