結果
問題 | No.3037 Restricted Lucas (Hard) |
ユーザー | みしあ |
提出日時 | 2021-10-22 12:24:59 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 7 ms / 2,000 ms |
コード長 | 1,949 bytes |
コンパイル時間 | 786 ms |
コンパイル使用メモリ | 75,780 KB |
実行使用メモリ | 6,940 KB |
最終ジャッジ日時 | 2024-09-22 14:13:45 |
合計ジャッジ時間 | 1,416 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,812 KB |
testcase_01 | AC | 5 ms
6,940 KB |
testcase_02 | AC | 7 ms
6,940 KB |
testcase_03 | AC | 6 ms
6,940 KB |
testcase_04 | AC | 6 ms
6,940 KB |
testcase_05 | AC | 7 ms
6,940 KB |
testcase_06 | AC | 6 ms
6,940 KB |
ソースコード
#include <iostream> #include <utility> #include <vector> #include <numeric> using namespace std; using ll = long long; const ll t = true, f = false, tt = t << t; ll ad(ll a, ll b){ vector<ll> tmp{a}; return accumulate(tmp.begin(), tmp.end(), b); } ll mn(ll a, ll b){ return ad(a, ad(~b, t)); } template<class... Args> ll Num(Args... args){ ll ret = f; for(auto v : initializer_list<ll>{args...}){ ret <<= t; ret |= v; } return ret; } const ll mod = Num(t,t,t,f,t,t,t,f,f,t,t,f,t,f,t,t,f,f,t,f,t,f,f,f,f,f,f,t,t,t); ll md(ll x){ if(x >= mod){ x = mn(x, mod); } return x; } ll mm(ll a, ll b){ ll ret = f; if(a>b){ swap(a, b); } while(a){ if(a&t){ ret = ad(ret, b); ret = md(ret); } b <<= t; a >>= t; b = md(b); } return ret; } ll pp(ll a, ll b){ ll x = ad(a, b); return md(x); } struct Mat{ ll ul, ur, dl, dr; Mat(){ ul = ur = dl = dr = f; } Mat(ll _ul, ll _ur, ll _dl, ll _dr){ ul = _ul; ur = _ur; dl = _dl; dr = _dr; } Mat mul(const Mat &m){ Mat ret; ret.ul = pp(mm(ul, m.ul), mm(ur, m.dl)); ret.ur = pp(mm(ul, m.ur), mm(ur, m.dr)); ret.dl = pp(mm(dl, m.ul), mm(dr, m.dl)); ret.dr = pp(mm(dl, m.ur), mm(dr, m.dr)); return ret; } }; ll R(ll i){ if(i == f){ return tt; } if(i == t){ return t; } Mat ret(t, f, f, t); Mat two(t, t, t, f); Mat las(t, f, tt, f); ll x = mn(i, t); while(x){ if(x&t){ ret = ret.mul(two); } two = two.mul(two); x >>= t; } ret = ret.mul(las); return ret.ul; } int main(){ ll C; cin >> C; for(int i=f; i<C; i=ad(i, t)){ ll N; cin >> N; cout << R(N) << endl; } return f; }