P1306 斐波那契公约数
-
题目
-
分析
记个结论:
f n f_n fn 表示 F i b o n a c c i Fibonacci Fibonacci 数列第 n n n 项。
g c d ( f n , f m ) = f g c d ( n , m ) gcd(f_n,f_m) = f_{gcd(n,m)} gcd(fn,fm)=fgcd(n,m)
矩阵快速幂一下,在用结论求一下即可。。
-
代码
const int mod = 1e8; int n, m; void mul(int f[2], int a[2][2]) { int c[2]; memset(c, 0, sizeof(c)); for (int j = 0; j < 2; j++) for (int k = 0; k < 2; k++) c[j] = (c[j] + (long long)f[k] * a[k][j]) % mod; memcpy(f, c, sizeof(c)); } void mulself(int a[2][2]) { int c[2][2]; memset(c, 0, sizeof(c)); for (int i = 0; i < 2; i++) for (int j = 0; j < 2; j++) for (int k = 0; k < 2; k++) c[i][j] = (c[i][j] + (long long)a[i][k] * a[k][j]) % mod; memcpy(a, c, sizeof(c)); } int main() { int n, m; read(n); read(m); int _ = gcd(n, m); int f[2] = {0, 1}; int a[2][2] = {{0, 1}, {1, 1}}; for (; _; _ >>= 1) { if (_ & 1) mul(f, a); mulself(a); } cout << f[0] << endl; return 0; }
-
题型
矩阵快速幂 + 结论