Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- using namespace std;
- long long n, m;
- void multiply(long long F[2][2], long long M[2][2]);
- void power(long long F[2][2], long long n);
- long long fib(long long n) {
- long long F[2][2] = {{1,1},{1,0}};
- if (n == 0) return 0;
- power(F, n-1);
- return F[0][0];
- }
- void power(long long F[2][2], long long n) {
- if( n == 0 || n == 1) return;
- long long M[2][2] = {{1,1},{1,0}};
- power(F, n/2);
- multiply(F, F);
- if (n%2 != 0) multiply(F, M);
- }
- void multiply(long long F[2][2], long long M[2][2]) {
- long long x = ( ((F[0][0]%m)*(M[0][0]%m))%m + ((F[0][1]%m)*(M[1][0]%m))%m )%m;
- long long y = ( ((F[0][0]%m)*(M[0][1]%m))%m + ((F[0][1]%m)*(M[1][1]%m))%m )%m;
- long long z = ( ((F[1][0]%m)*(M[0][0]%m))%m + ((F[1][1]%m)*(M[1][0]%m))%m )%m;
- long long w = ( ((F[1][0]%m)*(M[0][1]%m))%m + ((F[1][1]%m)*(M[1][1]%m))%m )%m;
- F[0][0] = x;
- F[0][1] = y;
- F[1][0] = z;
- F[1][1] = w;
- }
- int main() {
- scanf("%lld%lld", &n, &m);
- printf("%lld", fib(n));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement