Advertisement
Alexvans

Untitled

Sep 5th, 2017
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.98 KB | None | 0 0
  1. #include <cstdio>
  2. using namespace std;
  3.  
  4. long long n, m;
  5. void multiply(long long F[2][2], long long M[2][2]);
  6. void power(long long F[2][2], long long n);
  7.  
  8. long long fib(long long n) {
  9.     long long F[2][2] = {{1,1},{1,0}};
  10.     if (n == 0) return 0;
  11.     power(F, n-1);
  12.     return F[0][0];
  13. }
  14. void power(long long F[2][2], long long n) {
  15.     if( n == 0 || n == 1) return;
  16.  
  17.     long long M[2][2] = {{1,1},{1,0}};
  18.  
  19.     power(F, n/2);
  20.     multiply(F, F);
  21.  
  22.     if (n%2 != 0) multiply(F, M);
  23. }
  24. void multiply(long long F[2][2], long long M[2][2]) {
  25.     long long x = ( ((F[0][0]%m)*(M[0][0]%m))%m + ((F[0][1]%m)*(M[1][0]%m))%m )%m;
  26.     long long y = ( ((F[0][0]%m)*(M[0][1]%m))%m + ((F[0][1]%m)*(M[1][1]%m))%m )%m;
  27.     long long z = ( ((F[1][0]%m)*(M[0][0]%m))%m + ((F[1][1]%m)*(M[1][0]%m))%m )%m;
  28.     long long w = ( ((F[1][0]%m)*(M[0][1]%m))%m + ((F[1][1]%m)*(M[1][1]%m))%m )%m;
  29.  
  30.     F[0][0] = x;
  31.     F[0][1] = y;
  32.     F[1][0] = z;
  33.     F[1][1] = w;
  34. }
  35.  
  36. int main() {
  37.     scanf("%lld%lld", &n, &m);
  38.     printf("%lld", fib(n));
  39. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement