結果
問題 | No.1298 OR XOR |
ユーザー |
![]() |
提出日時 | 2024-11-27 00:38:08 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 2 ms / 2,000 ms |
コード長 | 1,323 bytes |
コンパイル時間 | 3,185 ms |
コンパイル使用メモリ | 242,688 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-11-27 00:38:17 |
合計ジャッジ時間 | 3,398 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 13 |
ソースコード
#include <bits/stdc++.h>using namespace std;int main(){unsigned long long N;cin >> N;unsigned long long M = N;if (popcount(N) == 1){cout << -1 << " " << -1 << " "<< - 1;}else{for (unsigned long long i = 0; M != 0; ++i){if (M & 1){unsigned long long L = 1 << i;cout << N << " " << L << " " << N - L;return 0;}M >>= 1; // 右シフト}}}// N=3// 011// Aは右二つのどちらかが1(どちらともありえる)// Bは右二つのどちらかが1(どちらともありえる)// Cは右二つのどちらかが1(どちらともありえる)// AorB=BorC=AorCは必ず存在するか?// 010101011// A A B BB// C C C CC// 存在する// 証明A=B=C=Nとすれば必ず成り立つ// A=B=C=Nのとき AxorBxorC=0になるか?// NxorNは0// 0xorNはN// なのでならない// 3つの桁をxorして必ず0になるためには1が偶数個の時// まず最初にA=Nとする// 次にNの適当な1の桁を立てたものをB// B以外の1の桁を立てたものをC// で成り立つ// 1のけたが1個だけの時// 1000// A=N B=N C=0// だけ 0は正の整数じゃないみたいなので-1を出力