結果
| 問題 |
No.526 フィボナッチ数列の第N項をMで割った余りを求める
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-10-29 19:49:37 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 2,000 ms |
| コード長 | 6,798 bytes |
| コンパイル時間 | 2,991 ms |
| コンパイル使用メモリ | 253,172 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-09-25 16:53:16 |
| 合計ジャッジ時間 | 3,785 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 12 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define VT(Type) vector<Type>
typedef long long LI; typedef VT(LI) VI; typedef VT(VI) VVI; typedef VT(VVI) V3I; typedef VT(V3I) V4I;
typedef long double LD; typedef VT(LD) VD; typedef VT(VD) VVD;
typedef VT(bool) VB; typedef VT(VB) VVB;
typedef VT(string) VS; typedef VT(VS) VVS;
typedef pair<LI, LI> PII; typedef VT(PII) VPII; typedef VT(VPII) VVPII;
typedef pair<LD, LD> PDD; typedef VT(PDD) VPDD; typedef VT(VPDD) VVPDD;
typedef pair<string, LI> PSI; typedef VT(PSI) VPSI;
typedef set<LI> SI; typedef set<PII> SPII; typedef multiset<LI> mSI; typedef VT(SI) VSI;
typedef map<LI, LI> MII; typedef map<PII, LI> MPIII; typedef multimap<LI, LI> mMII; typedef VT(MII) VMII;
typedef map<string, LI> MSI; typedef multimap<string, LI> mMSI; typedef VT(MSI) VMSI;
typedef queue<LI> QI; typedef queue<PII> QPII;
typedef priority_queue<PII, VPII, greater<PII> > PQPII; //優先順位付きqueue(昇順)
#define PQD(Type) priority_queue<Type>
#define PQU(Type) priority_queue<Type, VT(Type), greater<Type> >
#define PQ(Type) priority_queue<Type, VT(Type), function<bool(Type, Type)> >
#define REP(i, j, k) for(LI i = j; i < (LI)k; i++)
#define RREP(i, k, j) for(LI i = j - 1; i >= (LI)k; i--)
#define rep(i, j) REP(i, 0, j)
#define rrep(i, j) RREP(i, 0, j)
#define vrep(a, v) for(auto& a: v)
#define vcrep(a, v) for(const auto& a: v)
// 要素数 R の部分集合を bit全探索
#define brep(bit, N, R) for (LI bit = bits(R) - 1, x, y; bit < bits(N); x = bit & -bit, y = bit + x, bit = (((bit & ~y) / x) >> 1) | y)
#define all(v) v.begin(), v.end()
#define vsort(v) sort(all(v));
#define vsorto(v, o) sort(all(v), o);
#define vsortr(v) vsorto(v, greater<LI>())
#define scan(Type, a) Type a; cin >> a;
#define scan2(Type, a, b) scan(Type, a) scan(Type, b)
#define scan3(Type, a, b, c) scan2(Type, a, b) scan(Type, c)
#define scan4(Type, a, b, c, d) scan3(Type, a, b, c) scan(Type, d)
#define iscan(a) scan(LI, a)
#define iscan2(a, b) scan2(LI, a, b)
#define iscan3(a, b, c) scan3(LI, a, b, c)
#define iscan4(a, b, c, d) scan4(LI, a, b, c, d)
#define iscand(a) iscan(a) a--;
#define iscand2(a, b) iscand(a) iscand(b)
#define iscand3(a, b, c) iscand2(a, b) iscand(c)
#define iscand4(a, b, c, d) iscand3(a, b, c) iscand(d)
#define sscan(a) scan(string, a);
#define sscan2(a, b) scan(string, a, b);
#define vscan(Type, A, N) VT(Type) A(N); rep(mci, N) cin >> A[mci];
#define vscan2(Type, A, B, N) VT(Type) A(N), B(N); rep(mci, N) cin >> A[mci] >> B[mci];
#define vscan3(Type, A, B, C, N) VT(Type) A(N), B(N), C(N); rep(mci, N) cin >> A[mci] >> B[mci] >> C[mci];
#define vscan4(Type, A, B, C, D, N) VT(Type) A(N), B(N), C(N), D(N); rep(mci, N) cin >> A[mci] >> B[mci] >> C[mci] >> D[mci];
#define vvscan(Type, A, H, W) VT(VT(Type)) A(H, VT(Type)(W)); rep(mch, H) rep(mcw, W) cin >> A[mch][mcw];
#define viscan(A, N) vscan(LI, A, N)
#define viscan2(A, B, N) vscan2(LI, A, B, N)
#define viscan3(A, B, C, N) vscan3(LI, A, B, C, N)
#define viscan4(A, B, C, D, N) vscan4(LI, A, B, C, D, N)
#define vviscan(A, H, W) vvscan(LI, A, H, W)
#define viscand(A, N) viscan(A, N) rep(mci, N) A[mci]--;
#define viscand2(A, B, N) viscan2(A, B, N) rep(mci, N) { A[mci]--; B[mci]--; }
#define viscand3(A, B, C, N) viscan3(A, B, C, N) rep(mci, N) { A[mci]--; B[mci]--; C[mci]--; }
#define viscand4(A, B, C, D, N) viscan4(A, B, C, D, N) rep(mci, N) { A[mci]--; B[mci]--; C[mci]--; D[mci]--; }
#define vviscand(A, H, W) vviscan(A, H, W) rep(mch, H) rep(mcw, W) A[mch][mcw]--;
#define vpiscan(A, N) VPII A(N); rep(mci, N) cin >> A[mci].first >> A[mci].second;
#define vpiscand(A, N) vpiscan(A, N); rep(mci, N) { A[mci].first--; A[mci].second--; }
#define vpdscan(A, N) VPDD A(N); rep(mci, N) cin >> A[mci].first >> A[mci].second;
#define vsscan(S, N) vscan(string, S, N);
#define giscand(G, N, E) VVI G(N); rep(mci, E) { iscand2(mca, mcb); G[mca].push_back(mcb); }
#define gsscand(G, N, E) VVI G(N); rep(mci, E) { iscand2(mca, mcb); G[mca].push_back(mcb); G[mcb].push_back(mca); }
#define bits(x) (1LL << x)
#define inf(x) (x != INF ? x : -1)
#define maxa(a, b) a = max(a, b);
#define mina(a, b) a = min(a, b);
#define mida(a, b, c) a = min(max(a, b), c);
#define px front().first
#define py front().second
#define miman(v, a) (lower_bound(all(v), a) - v.begin())
#define ika(v, a) (upper_bound(all(v), a) - v.begin())
#define ijo(v, a) (v.end() - lower_bound(all(v), a))
#define yorio(v, a) (v.end() - upper_bound(all(v), a))
#define debug(x) cout << ">> " << #x << " = " << x << endl;
#define el cout << endl;
#define shown(a) cout << (a) << " ";
#define shown2(a, b) cout << (a) << " " << (b) << " ";
#define shown3(a, b, c) cout << (a) << " " << (b) << " " << (c) << " ";
#define shown4(a, b, c, d) cout << (a) << " " << (b) << " " << (c) << " " << (d) << " ";
#define show(a) cout << (a) << endl;
#define show2(a, b) cout << (a) << " " << (b) << endl;
#define show3(a, b, c) cout << (a) << " " << (b) << " " << (c) << endl;
#define show4(a, b, c, d) cout << (a) << " " << (b) << " " << (c) << " " << (d) << endl;
#define showif(f, a, b) if(f) cout << (a) << endl; else cout << (b) << endl;
#define dshow(x, n) cout << fixed << setprecision(n) << (x) << endl;
#define bshow(a, n) show(bitset<n>(a))
#define pshow(a) show2((a).first, (a).second)
#define pshown(a) shown2((a).first, (a).second)
#define pshow2(a, b) pshown(a) pshow(b)
#define ishow(a) show(inf(a))
#define yes(f) show(f ? "Yes" : "No")
#define vshown(A) vcrep(a, A) { shown(a) } el
#define vshow(A) vcrep(a, A) { show(a) }
#define vvshow(A) vcrep(a, A) { vshown(a) }
#define vbshown(A, n) vcrep(a, A) { shown(bitset<n>(a)) } el
#define vbshow(A, n) vcrep(a, A) { show(bitset<n>(a)) }
#define vvbshow(A, n) vcrep(a, A) { vbshow(a, n) }
#define vpshow(A) vcrep(a, A) { pshow(a) }
#define vishow(A) vcrep(a, A) { shown(inf(a)) } el
#define vvishow(A) vcrep(a, A) { vishow(a) }
const LI INF = (1LL << 60);
//const LI MOD = 998244353;
const LI MOD = 1000000007;
const LD PI = acos(-1);
class MAT {
private:
LI mod;
public:
MAT(LI mod_) : mod(mod_) {}
void tr(LI& n) {
n = (n + mod) % mod;
}
VVI x(const VVI& A, const VVI& B) {
VVI res(A.size(), VI(A.size(), 0));
rep(i, A.size()) rep(j, B[0].size()) rep(k, A[i].size()) {
res[i][j] += A[i][k] * B[k][j];
tr(res[i][j]);
}
return res;
}
VVI matpow(VVI A, LI N) {
VVI res(A.size(), VI(A.size(), 0));
rep(i, A.size()) res[i][i] = 1;
while (N) {
if (N & 1) res = x(res, A);
A = x(A, A);
N >>= 1;
}
return res;
}
};
int seisen_109() {
iscan2(N, M);
VVI A = { { 1, 1 }, { 1, 0 } };
MAT mat(M);
auto B = mat.matpow(A, N - 1);
show(B[1][0]);
return 0;
}
int main() {
seisen_109();
return 0;
}