hdu 3306 矩阵解决线性递推

来源:互联网 发布:seo网站排名优化工具 编辑:程序博客网 时间:2024/04/29 17:12
#include<stdio.h>#include<string.h>#include<algorithm>#define mod 10007using namespace std;struct Node{    int map[8][8];};Node operator *(Node a,Node b){   Node c;   memset(c.map,0,sizeof(c.map));   for(int i=0;i<4;i++)   {        for(int j=0;j<4;j++)        {            for(int k=0;k<4;k++)            {              c.map[i][j]+=(a.map[i][k]*b.map[k][j])%mod;            }        }   }return c;}Node operator ^(Node a,int k){    Node c;    memset(c.map,0,sizeof(c.map));    for(int i=0;i<4;i++)    for(int j=0;j<4;j++)    c.map[i][j]=(i==j);    while(k)    {        if(k&1)        c=c*a;        a=a*a;        k>>=1;    }    return c;}long long n, m , x , y;int main(){   while(scanf("%lld%lld%lld",&n,&x,&y)!=EOF)    {        Node a;        int sum=0;        memset(a.map,0,sizeof(a.map));        a.map[0][0] = a.map[2][1] = 1;        a.map[0][1] = a.map[1][1] = x*x%mod;        a.map[0][2] = a.map[1][2] = y*y%mod;        a.map[0][3] = a.map[1][3] = 2*x*y%mod;        a.map[3][1] = x%mod;        a.map[3][3] = y%mod;        a=a^(n-1);        sum+=(2*a.map[0][0]%mod+a.map[0][1]%mod+a.map[0][2]%mod+a.map[0][3]%mod) %mod;        printf("%dn",sum);    }}

原创粉丝点击