1. 程式人生 > >Division Game

Division Game

連結

題解

把一個數變成它的真因子,其實就是除以一個它的約數(也就是除以若干素約數的乘積) 數變小之後,約數集合變動很大,但是素約數集合只減少了你除以的那些數 所以這題要從素約數集合入手 每一行,對於每個數字,如果它有kk個約數,那麼就相當於有k1k-1個石子,每次給它除以一個數就是拿走若干個石子,這一行的石子個數加起來看作一個石子堆 然後就是nimnim遊戲了

程式碼

//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; }