您的位置:首页 > 其它

hdu 3306 矩阵解决线性递推

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