矩阵模板之一

来源:互联网 发布:mac mini 远程控制 编辑:程序博客网 时间:2024/05/16 06:50

一个大数的k次方  斐波那契数

#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;struct app{    int p[30][30];};app mult(app a, app b){    app c;    int i , j, k;    for( i =0; i<2; i++)     for(j =0; j<2; j++)     {         c.p[i][j]=0;  //注意清零的操作         for(k =0; k<2; k++)         {             c.p[i][j]=(c.p[i][j]+a.p[i][k]*b.p[k][j])%10000;  //取每个元素的后四位         }     }     return c;}app pow(app a, int k){    app b;   //用来返回值。    memset(b.p, 0, sizeof(b.p));   //注意清空的类型是数组时要确定到数组上。    for(int i=0;i<2; i++)    {        b.p[i][i]=1;    }    while(k)    {        if(k&1)         //所在为的二进制是一的时候        b=mult(b,a);        a=mult(a,a);      //二进制是零的情况也要继续相乘        k>>=1;           //向右一位。    }    return b;}int main(){    int n,t;    scanf("%d", &t);    while(t--)    {   scanf("%d", &n);        app a;        a.p={{1,1},{1,0}};   //f1 的值        app d=pow(a, n);        printf("%d\n",d.p[0][1]);   //d.p[0][0]是f[n+1]的值    }    return 0;}


 

原创粉丝点击