Advertisement
a53

Al

a53
Jul 22nd, 2021
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.68 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define MOD 1000000007
  3. #define ll long long int
  4. using namespace std;
  5. ifstream fin("al.in");
  6. ofstream fout("al.out");
  7. ll n,a,b,pat,E,invm,numi,ins,En;
  8. struct Mat
  9. {
  10. ll mat[2][2];
  11. };
  12. Mat nullMat=
  13. {
  14. {{1,0},
  15. {0,1}}
  16. };
  17. Mat initMat=
  18. {
  19. {{1,1},
  20. {1,0}}
  21. };
  22. Mat Alt=
  23. {
  24. {{1,0},
  25. {1,0}}
  26. };
  27. Mat sol=
  28. {
  29. {{1,0},
  30. {1,0}}
  31. };
  32. Mat C=
  33. {
  34. {{1,0},
  35. {1,0}}
  36. };
  37.  
  38. void gcd(ll &x,ll &y,ll a1,ll b1)
  39. {
  40. if(!b1)
  41. x=1,y=0;
  42. else
  43. {
  44. gcd(x,y,b1,a1%b1);
  45. ll aux=x;
  46. x=y;
  47. y=aux-y*(a1/b1);
  48. }
  49. }
  50.  
  51. Mat prod(Mat x,Mat y)
  52. {
  53. Mat ret;
  54. ret.mat[0][0]=(x.mat[0][0]*y.mat[0][0]+x.mat[0][1]*y.mat[1][0])%MOD;
  55. ret.mat[0][1]=(x.mat[0][0]*y.mat[0][1]+x.mat[0][1]*y.mat[1][1])%MOD;
  56. ret.mat[1][0]=(x.mat[1][0]*y.mat[0][0]+x.mat[1][1]*y.mat[1][0])%MOD;
  57. ret.mat[1][1]=(x.mat[1][0]*y.mat[0][1]+x.mat[1][1]*y.mat[1][1])%MOD;
  58. return ret;
  59. }
  60.  
  61. Mat pwr(Mat mat,ll n)
  62. {
  63. if(!n)
  64. return nullMat;
  65. if(n%2)
  66. return prod(mat,pwr(prod(mat,mat),n/2));
  67. return pwr(prod(mat,mat),n/2);
  68. }
  69.  
  70. int main()
  71. {
  72. fin>>n>>a>>b;
  73. if(n==1)
  74. {
  75. E=((a*a+b*b)*(2*b-2)-2*(b*b-a*a)+2*b)/(a*a+b*b-2*b+1);
  76. fout<<E;
  77. return 0;
  78. }
  79. numi=((b-1)*(b-1)+a*a);
  80. pat=(a*a+b*b);
  81. gcd(invm,ins,numi,MOD);
  82. initMat.mat[0][0]=2*b;
  83. initMat.mat[0][1]=-(pat);
  84. Alt.mat[1][0]=2*b;
  85. Alt.mat[0][0]=2*(b*b-a*a);
  86. C=pwr(initMat,n-1);
  87. sol=prod(C,Alt);
  88. En=(-2*pat+2*b);
  89. E=(pat*sol.mat[1][0]-sol.mat[0][0]+En)%MOD;
  90. E=(E*invm)%MOD;
  91. if(E<0)
  92. E=MOD+E%MOD;
  93. fout<<E;
  94. return 0;
  95. }
  96.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement