Division Game
阿新 • • 發佈:2018-12-11
連結
題解
把一個數變成它的真因子,其實就是除以一個它的約數(也就是除以若干素約數的乘積) 數變小之後,約數集合變動很大,但是素約數集合只減少了你除以的那些數 所以這題要從素約數集合入手 每一行,對於每個數字,如果它有個約數,那麼就相當於有個石子,每次給它除以一個數就是拿走若干個石子,這一行的石子個數加起來看作一個石子堆 然後就是遊戲了
程式碼
//NIM遊戲
#include <bits/stdc++.h>
#define maxn 10010
using namespace std;
int N, M, a[maxn], prime[maxn], mark[maxn];
int read(int x=0)
{
int c, f=1;
for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-1;
for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+c-48;
return f*x;
}
void shai()
{
int i, j;
for(i=2;i<maxn;i++)
{
if(!mark[i])prime[++*prime]=i;
for(j=1;j<=*prime and i*prime[ j]<maxn;j++)
{
mark[i*prime[j]]=1;
if(i%prime[j]==0)break;
}
}
}
int main()
{
int i, j, T=read(), kase, nim_sum, k, x;
shai();
for(kase=1;kase<=T;kase++)
{
N=read(), M=read();
nim_sum=0;
for(i=1;i<=N;i++)
{
a[i]=0;
for(j=1;j<=M;j++)
{
x=read();
for(k= 1;x>1;k++)while(x%prime[k]==0)x/=prime[k], a[i]++;
}
nim_sum^=a[i];
}
printf("Case #%d: ",kase);
if(nim_sum==0)printf("NO\n");
else printf("YES\n");
}
return 0;
}