結果

問題 No.2496 LCM between Permutations
ユーザー 沙耶花
提出日時 2023-10-06 22:08:24
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 114 ms / 2,000 ms
コード長 1,936 bytes
コンパイル時間 4,221 ms
コンパイル使用メモリ 253,404 KB
最終ジャッジ日時 2025-02-17 05:08:39
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 28
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:101:17: warning: ‘ii’ may be used uninitialized [-Wmaybe-uninitialized]
  101 |         ii = (ii+1)%N;
      |              ~~~^~~
main.cpp:88:13: note: ‘ii’ was declared here
   88 |         int ii;
      |             ^~

ソースコード

diff #
プレゼンテーションモードにする

#include <stdio.h>
#include <atcoder/all>
#include <bits/stdc++.h>
using namespace std;
using namespace atcoder;
using mint = modint998244353;
#define rep(i,n) for (int i = 0; i < (n); ++i)
#define Inf32 1000000001
#define Inf64 1000000000000000001
int N;
bool is_good(int n){
if(n*2<=N)return false;
for(int i=2;i*i<=n;i++){
if(n%i==0)return false;
}
return true;
}
int query(int i,int j){
cout<<"? "<<i+1<<' '<<j+1<<endl;
int ret;
cin>>ret;
return ret;
}
void answer(vector<int> a,vector<int> b){
cout<<"!";
rep(i,a.size()){
cout<<' '<<a[i];
}
rep(i,a.size()){
cout<<' '<<b[i];
}
cout<<endl;
exit(0);
}
int main(){
cin>>N;
if(N==1){
answer({1},{1});
}
vector<int> a(N,-1),b(N,-1);
{
vector<int> ret(N);
rep(i,N){
ret[i] = query(0,i);
}
a[0] = *min_element(ret.begin(),ret.end());
bool f = is_good(a[0]);
rep(i,N){
if(a[0]==ret[i])continue;
if(f || is_good(ret[i]/a[0])){
b[i] = ret[i] / a[0];
}
}
if(f){
rep(i,N){
if(a[0]==ret[i]){
int r = query(1,i);
if(r%a[0]==0){
b[i] = a[0];
for(int j=i+1;j<N;j++){
if(a[0]==ret[j]){
b[j] = 1;
}
}
}
else{
b[i] = 1;
for(int j=i+1;j<N;j++){
if(a[0]==ret[j]){
b[j] = a[0];
}
}
}
break;
}
}
}
}
int ii;
rep(i,N){
if(b[i]>0&&is_good(b[i])){
ii = i;
break;
}
}
for(int i=1;i<N;i++){
int r = query(i,ii);
if(r==b[ii])continue;
a[i] = r / b[ii];
}
int x = b[ii];
ii = (ii+1)%N;
rep(i,N){
if(a[i]==-1){
int r = query(i,ii);
if(r%x== 0){
a[i] = x;
for(int j=i+1;j<N;j++){
if(a[j]==-1)a[j] = 1;
}
}
else{
a[i] = 1;
for(int j=i+1;j<N;j++){
if(a[j]==-1)a[j] = x;
}
}
break;
}
}
rep(i,N){
if(a[i]==1)ii = i;
}
rep(i,N){
if(b[i]==-1){
b[i] = query(ii,i);
}
}
answer(a,b);
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0