GCD Game HDU - 7061
生活随笔
收集整理的這篇文章主要介紹了
GCD Game HDU - 7061
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
GCD Game HDU - 7061
題意:
有n個(gè)數(shù)ai,兩個(gè)人輪流操作,每次選擇一個(gè)數(shù)ai,再人選一個(gè)x(1<=x<ai),然后用gcd(ai,x)代替ai
誰先不能操作誰先輸?shù)舯荣?/p>
題解:
第一反應(yīng)nim游戲,gcd是取最大公約數(shù),每個(gè)數(shù)我們都可以分解成一些質(zhì)因子相乘的形式,例如:ai= x * y *z(x,y,z均為ai的質(zhì)因子),然后一個(gè)人操作時(shí)選了xy,gcd(xy,ai)=xy,相當(dāng)于將z取走了,其實(shí)也就是每次取走的時(shí)一個(gè)或多個(gè)質(zhì)因子,那質(zhì)因子的個(gè)數(shù)相當(dāng)于是石頭的數(shù)量,每次可以取任意個(gè),這不就是nim博弈嗎
代碼:
#include<bits/stdc++.h> using namespace std; int num[10000010]; int prm[10000010],cnt; bool f[10000010]; int t,n; int main() {for(int i=2;i<=10000000;i++){if(!f[i])prm[++cnt]=i,num[i]=1;for(int j=1;j<=cnt && i*prm[j]<=10000000;j++){f[i*prm[j]]=true;num[i*prm[j]]=num[i]+1;if(i%prm[j]==0)break;}}scanf("%d",&t);while(t--){int ans=0;scanf("%d",&n);for(int i=1;i<=n;i++){int x;scanf("%d",&x);ans^=num[x];}if(ans)puts("Alice");else puts("Bob");}return 0; }總結(jié)
以上是生活随笔為你收集整理的GCD Game HDU - 7061的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 氨氯地平导致牙龈增生该怎么办?
- 下一篇: H - Square Card HDU