Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define MOD 1000000007
- #define ll long long int
- using namespace std;
- ifstream fin("al.in");
- ofstream fout("al.out");
- ll n,a,b,pat,E,invm,numi,ins,En;
- struct Mat
- {
- ll mat[2][2];
- };
- Mat nullMat=
- {
- {{1,0},
- {0,1}}
- };
- Mat initMat=
- {
- {{1,1},
- {1,0}}
- };
- Mat Alt=
- {
- {{1,0},
- {1,0}}
- };
- Mat sol=
- {
- {{1,0},
- {1,0}}
- };
- Mat C=
- {
- {{1,0},
- {1,0}}
- };
- void gcd(ll &x,ll &y,ll a1,ll b1)
- {
- if(!b1)
- x=1,y=0;
- else
- {
- gcd(x,y,b1,a1%b1);
- ll aux=x;
- x=y;
- y=aux-y*(a1/b1);
- }
- }
- Mat prod(Mat x,Mat y)
- {
- Mat ret;
- ret.mat[0][0]=(x.mat[0][0]*y.mat[0][0]+x.mat[0][1]*y.mat[1][0])%MOD;
- ret.mat[0][1]=(x.mat[0][0]*y.mat[0][1]+x.mat[0][1]*y.mat[1][1])%MOD;
- ret.mat[1][0]=(x.mat[1][0]*y.mat[0][0]+x.mat[1][1]*y.mat[1][0])%MOD;
- ret.mat[1][1]=(x.mat[1][0]*y.mat[0][1]+x.mat[1][1]*y.mat[1][1])%MOD;
- return ret;
- }
- Mat pwr(Mat mat,ll n)
- {
- if(!n)
- return nullMat;
- if(n%2)
- return prod(mat,pwr(prod(mat,mat),n/2));
- return pwr(prod(mat,mat),n/2);
- }
- int main()
- {
- fin>>n>>a>>b;
- if(n==1)
- {
- E=((a*a+b*b)*(2*b-2)-2*(b*b-a*a)+2*b)/(a*a+b*b-2*b+1);
- fout<<E;
- return 0;
- }
- numi=((b-1)*(b-1)+a*a);
- pat=(a*a+b*b);
- gcd(invm,ins,numi,MOD);
- initMat.mat[0][0]=2*b;
- initMat.mat[0][1]=-(pat);
- Alt.mat[1][0]=2*b;
- Alt.mat[0][0]=2*(b*b-a*a);
- C=pwr(initMat,n-1);
- sol=prod(C,Alt);
- En=(-2*pat+2*b);
- E=(pat*sol.mat[1][0]-sol.mat[0][0]+En)%MOD;
- E=(E*invm)%MOD;
- if(E<0)
- E=MOD+E%MOD;
- fout<<E;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement