結果
| 問題 |
No.2125 Inverse Sum
|
| コンテスト | |
| ユーザー |
👑 |
| 提出日時 | 2022-11-18 23:14:55 |
| 言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,228 bytes |
| コンパイル時間 | 1,924 ms |
| コンパイル使用メモリ | 195,928 KB |
| 最終ジャッジ日時 | 2025-02-08 22:25:37 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 WA * 1 |
| other | AC * 16 WA * 14 |
ソースコード
#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 FOREQ( VAR , INITIAL , FINAL ) for( TYPE_OF( FINAL ) VAR = INITIAL ; VAR <= FINAL ; VAR ++ )
#define FOREQINV( VAR , INITIAL , FINAL ) for( TYPE_OF( INITIAL ) VAR = INITIAL ; VAR >= FINAL ; VAR -- )
#define QUIT return 0
#define RETURN( ANSWER ) cout << ( ANSWER ) << "\n"; QUIT
class NM
{
public :
ll m_N;
ll m_M;
inline NM( const ll& N = 0 , const ll& M = 0 ) : m_N( N ) , m_M( M ) {};
};
inline bool operator<( const NM& NM0 , const NM& NM1 ) { return NM0.m_N < NM1.m_N; }
template <typename INT>
INT GCD( const INT& b_0 , const INT& b_1 )
{
INT b[2] = { b_0 , b_1 };
int i_0 = ( b_0 >= b_1 ? 0 : 1 );
int i_1 = 1 - i_0;
while( b[i_1] != 0 ){
b[i_0] %= b[i_1];
swap( i_0 , i_1 );
}
return b[i_0];
}
int main()
{
CEXPR( ll , bound_PQ , 1000000000 );
CIN_ASSERT( P , 1 , bound_PQ );
CIN_ASSERT( Q , 1 , bound_PQ );
CEXPR( ll , rQ , 31622 );
NM answer[rQ];
// N = ab , M = bc , b = gcd( N , M )
// 1/N + 1/M = (a+c) / abc
// gcd( a + c , ac ) = 1 , ac | Q
ll b , c , N , M;
int T = 0;
FOREQ( a , 1 , Q ){
if( a * a > Q ){
break;
}
if( Q % a == 0 ){
c = Q / a;
if( GCD<ll>( a , c ) == 1 ){
b = ( ( ( ( a + c ) * Q ) / P ) / a ) / c;
if( ( a + c ) * Q == a * b * c * P ){
N = a * b;
M = b * c;
if( N > 0 && M > 0 ){
answer[T] = NM( N , M );
T++;
if( N != M ){
answer[T] = NM( M , N );
T++;
}
}
}
}
}
}
cout << T << "\n";
sort( answer , answer + T );
FOR( t , 0 , T ){
NM& NMt = answer[t];
cout << NMt.m_N << " " << NMt.m_M << "\n";
}
QUIT;
}