首页 > 代码库 > HDOJ 4686 Arc of Dream 矩阵快速幂
HDOJ 4686 Arc of Dream 矩阵快速幂
矩阵快速幂:
根据关系够建矩阵 , 快速幂解决.
Arc of Dream
Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)
Total Submission(s): 2164 Accepted Submission(s): 680
Problem Description
An Arc of Dream is a curve defined by following function:
where
a0 = A0
ai = ai-1*AX+AY
b0 = B0
bi = bi-1*BX+BY
What is the value of AoD(N) modulo 1,000,000,007?
where
a0 = A0
ai = ai-1*AX+AY
b0 = B0
bi = bi-1*BX+BY
What is the value of AoD(N) modulo 1,000,000,007?
Input
There are multiple test cases. Process to the End of File.
Each test case contains 7 nonnegative integers as follows:
N
A0 AX AY
B0 BX BY
N is no more than 1018, and all the other integers are no more than 2×109.
Each test case contains 7 nonnegative integers as follows:
N
A0 AX AY
B0 BX BY
N is no more than 1018, and all the other integers are no more than 2×109.
Output
For each test case, output AoD(N) modulo 1,000,000,007.
Sample Input
11 2 34 5 621 2 34 5 631 2 34 5 6
Sample Output
41341902
Author
Zejun Wu (watashi)
Source
2013 Multi-University Training Contest 9
[cpp] view plaincopy
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <cmath>
- using namespace std;
- typedef long long int LL;
- const LL mod=1000000007LL;
- struct Matrix
- {
- int x,y;
- LL m[6][6];
- Matrix() {x=y=5;memset(m,0,sizeof(m));}
- void one()
- {
- for(int i=0;i<5;i++) m[i][i]=1LL;
- }
- void show()
- {
- cout<<x<<" * "<<y<<endl;
- for(int i=0;i<x;i++)
- {
- for(int j=0;j<y;j++)
- cout<<m[i][j]<<",";
- cout<<endl;
- }
- }
- };
- Matrix Mul(Matrix& a,Matrix& b)
- {
- Matrix ret;
- ret.x=a.x; ret.y=b.y;
- for(int i=0;i<a.x;i++)
- {
- for(int j=0;j<b.y;j++)
- {
- LL temp=0;
- for(int k=0;k<b.y;k++)
- {
- temp=(temp+(a.m[i][k]*b.m[k][j])%mod)%mod;
- }
- ret.m[i][j]=temp%mod;
- }
- }
- return ret;
- }
- Matrix quickPow(Matrix m,LL x)
- {
- Matrix e;
- e.one();
- while(x)
- {
- if(x&1LL) e=Mul(e,m);
- m=Mul(m,m);
- x/=2LL;
- }
- return e;
- }
- LL n,A0,B0,AX,AY,BX,BY;
- Matrix init_matrix()
- {
- Matrix ret;
- ret.m[0][0]=1;
- ret.m[1][0]=AY; ret.m[1][1]=AX;
- ret.m[2][0]=BY; ret.m[2][2]=BX;
- ret.m[3][0]=(BY*AY)%mod; ret.m[3][1]=(AX*BY)%mod;
- ret.m[3][2]=(BX*AY)%mod; ret.m[3][3]=(AX*BX)%mod;
- ret.m[4][3]=1LL; ret.m[4][4]=1LL;
- return ret;
- }
- Matrix Beg()
- {
- Matrix beg;
- beg.m[0][0]=1;
- beg.m[1][0]=A0;
- beg.m[2][0]=B0;
- beg.m[3][0]=A0*B0%mod;
- return beg;
- }
- int main()
- {
- while(cin>>n)
- {
- cin>>A0>>AX>>AY>>B0>>BX>>BY;
- A0=A0%mod; AX=AX%mod; AY=AY%mod;
- B0=B0%mod; BX=BX%mod; BY=BY%mod;
- Matrix m=init_matrix();
- m=quickPow(m,n);
- Matrix beg=Beg();
- LL ans=0;
- for(int i=0;i<5;i++)
- ans=(ans+beg.m[i][0]*m.m[4][i]%mod)%mod;
- cout<<ans<<endl;
- }
- return 0;
- }
HDOJ 4686 Arc of Dream 矩阵快速幂
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。