結果
| 問題 |
No.8036 Restricted Lucas (Easy)
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-10-22 12:08:01 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 6 ms / 2,000 ms |
| コード長 | 1,760 bytes |
| コンパイル時間 | 929 ms |
| コンパイル使用メモリ | 71,064 KB |
| 最終ジャッジ日時 | 2025-01-25 02:48:02 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 6 |
ソースコード
#include <iostream>
#include <utility>
using namespace std;
using ll = long long;
const ll t = true, f = false;
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 -= mod;
}
return x;
}
ll mm(ll a, ll b){
ll ret = f;
if(a>b){
swap(a, b);
}
while(a){
if(a&t){
ret += b;
ret = md(ret);
}
b <<= t;
a >>= t;
b = md(b);
}
return ret;
}
ll pp(ll a, ll b){
ll x = a+b;
if(x >= mod){
x-=mod;
}
return 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 t+t;
}
if(i == t){
return t;
}
Mat ret(t, f, f, t);
Mat two(t, t, t, f);
Mat las(t, f, t+t, f);
ll x = 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++){
ll N;
cin >> N;
cout << R(N) << endl;
}
return f;
}