結果
| 問題 |
No.2187 三立法和 mod 333
|
| コンテスト | |
| ユーザー |
👑 |
| 提出日時 | 2022-12-18 16:28:06 |
| 言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
| 結果 |
TLE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 3,766 bytes |
| コンパイル時間 | 985 ms |
| コンパイル使用メモリ | 77,032 KB |
| 最終ジャッジ日時 | 2025-02-09 16:27:16 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | TLE * 33 |
ソースコード
#pragma GCC optimize ( "O3" )
#pragma GCC target ( "avx" )
#include <iostream>
#include <string>
#include <stdio.h>
#include <stdint.h>
#include <cassert>
#include <vector>
using namespace std;
using ll = long long;
#define TYPE_OF( VAR ) remove_const<remove_reference<decltype( VAR )>::type >::type
#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 FOR_ITR( ARRAY , ITR , END ) for( auto ITR = ARRAY .begin() , END = ARRAY .end() ; ITR != END ; ITR ++ )
#define QUIT return 0
#define RETURN( ANSWER ) cout << ( ANSWER ) << "\n"; QUIT
#include <cassert>
#define MAIN main
// 通常の二分探索(単調関数-目的値が区間内に一意実数解を持つ場合にそれを超えない最大の整数を返す)
#define BS( ANSWER , MINIMUM , MAXIMUM , EXPRESSION , TARGET ) \
ll ANSWER = MAXIMUM; \
{ \
ll VARIABLE_FOR_BINARY_SEARCH_L = MINIMUM; \
ll VARIABLE_FOR_BINARY_SEARCH_U = ANSWER; \
ll VARIABLE_FOR_DIFFERENCE_FOR_BINARY_SEARCH = ( TARGET ) - ( EXPRESSION ); \
if( VARIABLE_FOR_DIFFERENCE_FOR_BINARY_SEARCH == 0 ){ \
VARIABLE_FOR_BINARY_SEARCH_L = ANSWER; \
} else { \
ANSWER = ( VARIABLE_FOR_BINARY_SEARCH_L + VARIABLE_FOR_BINARY_SEARCH_U ) / 2; \
} \
while( VARIABLE_FOR_BINARY_SEARCH_L != ANSWER ){ \
VARIABLE_FOR_DIFFERENCE_FOR_BINARY_SEARCH = ( TARGET ) - ( EXPRESSION ); \
if( VARIABLE_FOR_DIFFERENCE_FOR_BINARY_SEARCH == 0 ){ \
break; \
} else { \
if( VARIABLE_FOR_DIFFERENCE_FOR_BINARY_SEARCH > 0 ){ \
VARIABLE_FOR_BINARY_SEARCH_L = ANSWER; \
} else { \
VARIABLE_FOR_BINARY_SEARCH_U = ANSWER; \
} \
ANSWER = ( VARIABLE_FOR_BINARY_SEARCH_L + VARIABLE_FOR_BINARY_SEARCH_U ) / 2; \
} \
} \
} \
\
#define COMPUTE( VAR ) VAR ## 5 = VAR * VAR; VAR ## 3 = VAR ## 5 * VAR; VAR ## 5 *= VAR ##3
#define COUNT_SOLUTION( VAR1 , VAR2 ) \
diff5 = bound_sum - VAR1 ## 5 - VAR2 ## 5; \
if( diff5 > 0 ){ \
BS( z_max , 1 , bound_xyzll , z_max * z_max * z_max * z_max * z_max , diff5 ); \
diff3 = ( A - bound_A - VAR1 ## 3 - VAR2 ## 3 ) % bound_All + bound_All; \
answer += ( int( z_max ) + z_min_minus[diff3] ) / bound_A; \
} else { \
break; \
} \
int MAIN()
{
CEXPR( int , bound_A , 3333 );
CEXPR( ll , bound_All , bound_A );
CIN_ASSERT( A , 1 , bound_A );
CEXPR( ll , bound_sum , 1000000000000000007 );
CEXPR( int , bound_xyz , 3982 );
CEXPR( ll , bound_xyzll , bound_xyz );
int answer = 0;
// 法3333 = 3×11×101において3乗は全単射であることに注意
int z_min_minus[bound_A];
FOREQ( i , 1 , bound_All ){
z_min_minus[ ( i * i * i ) % bound_All ] = bound_A - int( i );
}
ll x3 , y3 , x5 , y5 , diff3 , diff5;
FOR( x , 1 , bound_xyz ){
COMPUTE( x );
FOR( y , x+1 , bound_xyz ){
COMPUTE( y );
COUNT_SOLUTION( x , y );
}
}
answer *= 2;
FOR( x , 1 , bound_xyz ){
COMPUTE( x );
COUNT_SOLUTION( x , x );
}
RETURN( answer );
}
// bound_xyzの前計算
// int MAIN()
// {
// CEXPR( ll , bound , 1000000000000000007 );
// ll i = 3000;
// while( true ){
// if( i * i * i * i * i > bound ){
// RETURN( i );
// }
// i++;
// }
// return;
// }