若番は1つのコンテストに1つしか問題がないので記事が一杯書けますね><
No.2 素因数ゲーム
No.2 素因数ゲーム - yukicoder
競技プログラミングの練習サイト
ある2以上の数Nが与えられる。
Nに対してある素因数aで好きなだけ割るということを二人で交互に行った場合、1を作れるプレイヤーはどちらか?
“素因数で好きなだけ割れる”を、各素因数の山があり、同じ山からは複数個取れる。
とした場合、あるゲームに似ている感じがします。
ニム - Wikipedia
競プロでおなじみnimです。
nimは最善手を取った場合、それぞれの山の数でXORを取った結果が0の場合、後攻が勝ちます、それ以外の場合は先手が勝ちます。
今回は山の数=素因数の数のため、素因数の数を調べてXORを取っていくことでどちらが勝つかを求めることができます。
#include<bits/stdc++.h>
//#include<atcoder/all>
using namespace std;
//using namespace atcoder;
int main(){
int N;
cin>>N;
int r=sqrt(N)+2;
int xr=0;
for(int i=2;i<=r;i++){
int c=0;
while(N%i==0){
c++;
N/=i;
}
xr^=c;
}
if(N!=1) xr^=1;
if(xr==0) cout<<"Bob"<<endl;
else cout<<"Alice"<<endl;
}
コメント