結果
| 問題 |
No.2177 Recurring ab
|
| コンテスト | |
| ユーザー |
👑 |
| 提出日時 | 2022-11-16 23:36:47 |
| 言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 2,000 ms |
| コード長 | 2,289 bytes |
| コンパイル時間 | 1,744 ms |
| コンパイル使用メモリ | 193,344 KB |
| 最終ジャッジ日時 | 2025-02-08 20:50:23 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 18 |
ソースコード
#include<bits/stdc++.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 CEXPR( LL , BOUND , VALUE ) constexpr const LL BOUND = VALUE
#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 QUIT return 0
#define RETURN( ANSWER ) cout << ( ANSWER ) << "\n"; QUIT
#define CHECK_REDUNDANT_INPUT string VARIABLE_FOR_CHECK_REDUNDANT_INPUT = ""; cin >> VARIABLE_FOR_CHECK_REDUNDANT_INPUT; assert( VARIABLE_FOR_CHECK_REDUNDANT_INPUT == "" ); assert( ! cin );
// #define CHECK_REDUNDANT_INPUT string VARIABLE_FOR_CHECK_REDUNDANT_INPUT = ""; getline( cin , VARIABLE_FOR_CHECK_REDUNDANT_INPUT ); assert( VARIABLE_FOR_CHECK_REDUNDANT_INPUT == "" ); assert( ! cin );
int main()
{
CEXPR( ll , bound_N , 100000000 );
CIN_ASSERT( N , 1 , bound_N );
// CHECK_REDUNDANT_INPUT;
// (pa+b)/(p^2-1) > 1/N
// <=> N(pa+b) > p^2-1
// <=> p^2 - Nap - (Nb+1) < 0
// <=> Na/2 - (sqrt((Na)^2+4(Nb+1)))/2 < p < Na/2 + (sqrt((Na)^2+4(Nb+1)))/2
ll answer = 0;
ll Na = -N;
CEXPR( ll , bound_ab , 10 );
CEXPR( ll , bound_p , 1000000000 );
FOR( a , 0 , bound_ab ){
Na += N;
ll Na2 = Na * Na;
double Na_half = Na / 2.0;
ll Nb_plus = -N + 1;
FOR( b , 0 , bound_ab ){
Nb_plus += N;
if( a != b ){
double r = sqrt( Na2 + 4 * Nb_plus ) / 2.0;
ll low = Na_half - r;
if( low * low - Na * low - Nb_plus >= 0 ){
low++;
}
low = max( max( max( a , b ) + 1 , (ll)2 ) , low );
ll upp = Na_half + r;
if( upp * upp - Na * upp - Nb_plus >= 0 ){
upp--;
}
upp = min( bound_p , upp );
if( low <= upp ){
answer += upp - low + 1;
// デバッグ用
// for( ll p = low ; p <= upp ; p++ ){
// cout << "(p,a,b) = (" << p << "," << a << "," << b << ")" << endl;
// assert( ( p * a + b ) * N > p * p - 1 );
// assert( 2 <= p && a <= p - 1 && b <= p - 1 && p <= bound_p );
// }
}
}
}
}
RETURN( answer );
}