結果
| 問題 |
No.2787 グッドスタイン数列?
|
| コンテスト | |
| ユーザー |
👑 |
| 提出日時 | 2022-10-21 17:16:37 |
| 言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
| 結果 |
WA
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 1,939 bytes |
| コンパイル時間 | 628 ms |
| コンパイル使用メモリ | 67,388 KB |
| 最終ジャッジ日時 | 2025-02-08 09:46:07 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | WA * 53 RE * 2 |
ソースコード
#include <iostream>
#include <string>
#include <stdio.h>
#include <stdint.h>
using namespace std;
using ll = long long;
#define TYPE_OF( VAR ) remove_const<remove_reference<decltype( VAR )>::type >::type
#define UNTIE ios_base::sync_with_stdio( false ); cin.tie( nullptr )
#define CIN( LL , A ) LL A; cin >> A
#define ASSERT( A , MIN , MAX ) assert( MIN <= A && A <= MAX )
#define CIN_ASSERT( A , MIN , MAX ) CIN( TYPE_OF( MAX ) , A ); ASSERT( A , MIN , MAX )
#define FOR( VAR , INITIAL , FINAL_PLUS_ONE ) for( TYPE_OF( FINAL_PLUS_ONE ) VAR = INITIAL ; VAR < FINAL_PLUS_ONE ; VAR ++ )
#define FOREQ( VAR , INITIAL , FINAL ) for( TYPE_OF( FINAL ) VAR = INITIAL ; VAR <= FINAL ; VAR ++ )
#define REPEAT( HOW_MANY_TIMES ) FOR( VARIABLE_FOR_REPEAT , 0 , HOW_MANY_TIMES )
#define QUIT return 0
#define RETURN( ANSWER ) cout << ( ANSWER ) << "\n"; QUIT
#include <cassert>
#define MAIN main
inline constexpr const int L = 64;
void Decrement( int d , ll& c , ll ( &f )[L] , ll& b , const ll& M )
{
const ll b_copy = b;
b = b + b + 1;
c += b + 1;
if( c >= M ){
return;
}
if( d == 1 ){
f[1]--;
} else {
f[d]--;
FOR( d_minus , 1 , d ){
f[d_minus] = b_copy;
REPEAT( b_copy ){
Decrement( d_minus , c , f , b , M );
if( c >= M ){
return;
}
}
}
}
return;
}
int MAIN()
{
UNTIE;
constexpr const ll bound = 1000000000000000000;
CIN_ASSERT( N , 0 , bound );
CIN_ASSERT( M , 0 , bound );
CIN_ASSERT( B , 2 , bound );
cout << "YES\n";
ll f[L];
ll deg = L;
FOR( d , 0 , L ){
f[d] = N % B;
N /= B;
if( N == 0 ){
deg = d;
break;
}
}
ll& f0 = f[0];
ll c = f0 + f0;
B += f0;
f0 = 0;
FOREQ( d , 1 , deg ){
ll fd = f[d];
FOR( i , 0 , fd ){
Decrement( d , c , f , B , M );
if( c >= M ){
RETURN( "NO" );
}
}
}
c += 2;
if( c <= M ){
cout << "YES\n";
RETURN( c );
}
RETURN( "NO" );
}