結果
問題 |
No.3233 順列判定
|
ユーザー |
👑 |
提出日時 | 2024-02-12 21:50:00 |
言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 32 ms / 1,000 ms |
コード長 | 1,045 bytes |
コンパイル時間 | 2,135 ms |
コンパイル使用メモリ | 194,864 KB |
最終ジャッジ日時 | 2025-02-19 05:47:48 |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 40 |
ソースコード
#include <bits/stdc++.h> using namespace std; int main(){ int N; cin >> N; int M; cin >> M; int A[N]; for( int i = 1 ; i <= N ; i++ ){ // iのM乗をNで割った余りを繰り返し2乗法で計算する。 // int型だと計算途中でオーバーフローするのでlong long型を使う。 long long i_M = 1; long long power = i % N; int exponent = M; while( exponent > 0 ){ if( exponent % 2 == 1 ){ i_M = ( i_M * power ) % N; } power = ( power * power ) % N; exponent = exponent / 2; } // 添字が0始まりなので1ずれることに注意。 // Aの長さをN+1にすればA[i]にしてもよい。 A[i-1] = i_M; } // Aの長さをN+1にして調整した場合はここをsort( A + 1 , A + 1 + N )に。 sort( A , A + N ); for( int i = 0 ; i < N ; i++ ){ // Aの長さをN+1にして調整した場合はここをA[i+1]にする必要あり。 if( A[i] != i ){ cout << "No" << endl; return 0; } } cout << "Yes" << endl; }