Bladeren bron

添加 'H.cpp'

爱玲姐姐 5 jaren geleden
bovenliggende
commit
0aae1c9960
1 gewijzigde bestanden met toevoegingen van 65 en 0 verwijderingen
  1. 65 0
      H.cpp

+ 65 - 0
H.cpp

@@ -0,0 +1,65 @@
+#include <bits/stdc++.h>
+ 
+using namespace std;
+typedef long long LL;
+#define FOR(i, x, y) for (LL i = (x), _##i = (y); i < _##i; ++i)
+#define FORD(i, x, y) for (LL i = (x), _##i = (y); i > _##i; --i)
+ 
+struct Mat {
+    static const int MOD = 10000;
+    static const LL M = 2;
+    LL v[M][M];
+ 
+    Mat() { memset(v, 0, sizeof(v)); }
+ 
+    void eye() { FOR(i, 0, M)v[i][i] = 1; }
+ 
+    LL *operator[](LL x) { return v[x]; }
+ 
+    const LL *operator[](LL x) const { return v[x]; }
+ 
+    Mat operator*(const Mat &B) {
+        const Mat &A = *this;
+        Mat ret;
+        FOR (k, 0, M)
+            FOR (i, 0, M) if (A[i][k])
+                    FOR (j, 0, M)ret[i][j] = (ret[i][j] + A[i][k] * B[k][j]) % MOD;
+        return ret;
+    }
+ 
+    Mat pow(LL n) const {
+        Mat A = *this, ret;
+        ret.eye();
+        for (; n; n >>= 1, A = A * A)
+            if (n & 1) ret = ret * A;
+        return ret;
+    }
+ 
+    Mat operator+(const Mat &B) {
+        const Mat &A = *this;
+        Mat ret;
+        FOR (i, 0, M)FOR (j, 0, M)ret[i][j] = (A[i][j] + B[i][j]) % MOD;
+        return ret;
+    }
+ 
+    void prt() const {
+        FOR (i, 0, M)FOR (j, 0, M)printf("%lld%c", (*this)[i][j], j == M - 1 ? '\n' : ' ');
+    }
+};
+ 
+ 
+int main() {
+    Mat m;
+    m[0][0] = m[0][1] = m[1][0] = 1;
+    m[1][1] = 0;
+ 
+    for (int n; cin >> n and n != -1;) {
+        if (n == 0) {
+            cout << 0 << endl;
+            continue;
+        }
+        cout << m.pow(n - 1)[0][0] << endl;
+    }
+ 
+    return 0;
+}