SOJ-2984(Fibonacci,矩阵连乘简化计算)
来源:互联网 发布:大数据发展规划 编辑:程序博客网 时间:2024/06/06 19:12
typedef int ll;#define MOD 10000int main(){//freopen("Fibonacci.in", "r", stdin);//freopen("Fibonacci.out", "w", stdout); ll n; ll t[10000]; while (scanf("%d", &n) == 1 && n != -1){ if (n == 0) { printf("0\n"); continue ; } --n;//以下程序基于F0=1,F1=1,所以要做预处理 ll a = 1; ll b = 1; ll c = 1; ll d = 0; ll index = 0; while (n) { t[index++] = n % 2; n /= 2; } ll i; for (i = index - 2; i >= 0; --i) { if (t[i] == 0) { ll t1 = a, t2 = b, t3 = c, t4 = d; a = t1 * t1 + t2 * t3; b = t1 * t2 + t2 * t4; c = t3 * t1 + t4 * t3; d = t3 * t2 + t4 * t4; } else { ll t1 = a, t2 = b, t3 = c, t4 = d; a = t1 * t1 + t2 * t3; b = t1 * t2 + t2 * t4; c = t3 * t1 + t4 * t3; d = t3 * t2 + t4 * t4;a %= MOD;b %= MOD;c %= MOD;d %= MOD; t1 = a, t2 = b, t3 = c, t4 = d; a = t1 * 1 + t2 * 1; b = t1 * 1 + t2 * 0; c = t3 * 1 + t4 * 1; d = t3 * 1 + t4 * 0; } a %= MOD; b %= MOD; c %= MOD; d %= MOD; } printf("%d\n", a); } return 0;}