結果
| 問題 | 
                            No.8037 Restricted Lucas (Hard)
                             | 
                    
| コンテスト | |
| ユーザー | 
                             | 
                    
| 提出日時 | 2020-06-05 12:18:50 | 
| 言語 | C++17  (gcc 13.3.0 + boost 1.87.0)  | 
                    
| 結果 | 
                             
                                WA
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 2,013 bytes | 
| コンパイル時間 | 707 ms | 
| コンパイル使用メモリ | 68,448 KB | 
| 最終ジャッジ日時 | 2025-01-10 21:34:32 | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge5 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | WA * 1 | 
| other | WA * 6 | 
ソースコード
#include <iostream>
#define rep(i,n) for(int i=ZERO;i<(n);i=add(i,ONE))
using namespace std;
const int ZERO=false;
const int ONE=true;
const int TWO=ONE<<ONE;
int MOD;
int add(int a,int b){
	if(b==0){
		return a;
	}
	else if(b>0){
		return add(a^b,(a&b)<<ONE);
	}
	else{
		if(a>=0) return add(b,a);
		else     return add(~add(add(~a,ONE),add(~b,ONE)),ONE);
	}
}
int sub(int a,int b){
	return add(a,add(~b,ONE));
}
int modadd(int a,int b){
	if(a<ZERO) a=add(a,MOD);
	if(a>=MOD) a=sub(a,MOD);
	if(b<ZERO) b=add(b,MOD);
	if(b>=MOD) b=sub(b,MOD);
	int res=add(a,b);
	if(res<ZERO) res=add(res,MOD);
	if(res>=MOD) res=sub(res,MOD);
	return res;
}
int modmul(int a,int b){
	return b==ZERO?ZERO:modadd(modmul(a,b>>ONE)<<ONE,b&ONE?a:ZERO);
}
void modmul(int A[TWO][TWO],int B[TWO][TWO],int C[TWO][TWO]){
	int tmp[TWO][TWO]={};
	rep(i,TWO) rep(j,TWO) rep(k,TWO) {
		tmp[i][j]=modadd(tmp[i][j],modmul(A[i][k],B[k][j]));
	}
	rep(i,TWO) rep(j,TWO) C[i][j]=tmp[i][j];
}
void solve(){
	int A[TWO][TWO]={{ZERO,ONE},{ONE,ONE}};
	int B[TWO][TWO]={{ONE,ZERO},{ZERO,ONE}};
	int k; cin>>k;
	for(;k>ZERO;k>>=ONE){
		if(k&ONE) modmul(B,A,B);
		modmul(A,A,A);
	}
	cout<<modadd(modmul(B[ZERO][ZERO],TWO),B[ZERO][ONE])<<endl;
}
int main(){
	MOD=add(MOD<<ONE,ONE);
	MOD=add(MOD<<ONE,ONE);
	MOD=add(MOD<<ONE,ONE);
	MOD=add(MOD<<ONE,ZERO);
	MOD=add(MOD<<ONE,ONE);
	MOD=add(MOD<<ONE,ONE);
	MOD=add(MOD<<ONE,ONE);
	MOD=add(MOD<<ONE,ZERO);
	MOD=add(MOD<<ONE,ZERO);
	MOD=add(MOD<<ONE,ONE);
	MOD=add(MOD<<ONE,ONE);
	MOD=add(MOD<<ONE,ZERO);
	MOD=add(MOD<<ONE,ONE);
	MOD=add(MOD<<ONE,ZERO);
	MOD=add(MOD<<ONE,ONE);
	MOD=add(MOD<<ONE,ONE);
	MOD=add(MOD<<ONE,ZERO);
	MOD=add(MOD<<ONE,ZERO);
	MOD=add(MOD<<ONE,ONE);
	MOD=add(MOD<<ONE,ZERO);
	MOD=add(MOD<<ONE,ONE);
	MOD=add(MOD<<ONE,ZERO);
	MOD=add(MOD<<ONE,ZERO);
	MOD=add(MOD<<ONE,ZERO);
	MOD=add(MOD<<ONE,ZERO);
	MOD=add(MOD<<ONE,ZERO);
	MOD=add(MOD<<ONE,ZERO);
	MOD=add(MOD<<ONE,ONE);
	MOD=add(MOD<<ONE,ONE);
	MOD=add(MOD<<ONE,ONE);
	int q; cin>>q; rep(_,q) solve();
	return ZERO;
}