リンク:https://www.nowcoder.com/acm/contest/161/B
出典:ネットワーク牛オフ
タイトル説明
小さな小さな遊びのゲームでNとO。N彼らの前には、CIの大理石で開始した石のiヒープを石の山を置きます。彼らは、石のヒープから石を取って交代取ることはできません。最後に、人々はこのゲームを失うことを操作することはできません。しかし、彼らはそれがあまりにもルールを少し更新し、遊びに退屈されると思います。特に、これは次のとおりです。石の山のためにそこに正確メートルの作品は、石のこの山に人から取られた場合、石の石をヒープある彼は、その後、Mの約数でなければならないdはdの石の数を取るために提供されます。最後に、オペレータは、まだ失うことができません。
今、小さなN優勢。彼は、彼が勝つ戦略の第一歩だったどのように多くの異なる知りたいと思いました。ヒープ石から戦略手段、星石の数を除去しました。限りそれは違う、異なる数またはテイクの束を取るように、彼らはさまざまな戦略を考えられています。
説明を入力します。
最初の行の整数n。 次ラインnは、それぞれパイル砂利石の数を表す整数。 すべての数の入力データがより105以下であることを確認し、より大きい又は1に等しい整数です。
出力説明:
戦略を獲得する最初のステップの数を表す整数小$ N $の行。
例1
エントリー
10 47 18 9 36 10 1 13 19 29 1
輸出
7
明らかに、裸のボードが質問に自分自身を従事しないで、明らかに多くの学校の要因は1E5テーブルの無成功要因とテーブル、生と死を演じるよりも、何度も見ました。
//因子表打法
for(int i=1;i<=n;i++)
for(int j=1;j*i<=n;j++)
{
q[i*j].push_back(i);
}
今回は次の3行のコードを覚えておく必要があります。
その後、表1から100000のSG機能を再生することができます。SG機能がpoke理解することはできません https://mp.csdn.net/postedit/81512877
会議の後SG機能は、あなたがアップになり、この質問をpoj2975。Zhetijiuhuoは次のようにpoj2975。私たちは多くの要因を減算した後、XOR値の下で判断の残りの部分は0ではありませんたびにすることができます。残数が0であれば優勢因子、SGを取った後、次いで、失敗する運命にフリップ。ノートXOR演算子の優先順位の低いへのもう一つのポイントは、括弧を覚えています。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N 100001
int f[N],sg[N],has[N];
vector<int> q[100005];
void getSG(int n)
{
for(int i=1;i<=n;i++)
for(int j=1;j*i<=n;j++)
{
q[i*j].push_back(i);
}
memset(sg,0,sizeof(sg));
for(int i=1;i<=n;i++)
{
int len=q[i].size();
for(int j=0;j<len;j++)
has[sg[i-q[i][j]]]=1;
for(int j=0;j<=n;j++)
{
if(has[j]==0)
{
sg[i]=j;
break;
}
}
for(int j=0;j<len;j++)
has[sg[i-q[i][j]]]=0;
}
}
int a[100005];
int main()
{
int n;
getSG(100000);
scanf("%d",&n);
int ans=0;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;a[i]=x;
ans^=sg[x];
}
int sum=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<q[a[i]].size();j++)
if((sg[a[i]-q[a[i]][j]]^(ans^sg[a[i]]))==0) sum++;
}
printf("%d\n",sum);
return 0;
}