51Nod 1068 Bash遊戲 V3
阿新 • • 發佈:2018-12-15
基準時間限制:1 秒 空間限制:131072 KB 分值: 20 難度:3級演算法題
有一堆石子共有N個。A B兩個人輪流拿,A先拿。每次拿的數量只能是2的正整數次冪,比如(1,2,4,8,16....),拿到最後1顆石子的人獲勝。假設A B都非常聰明,拿石子的過程中不會出現失誤。給出N,問最後誰能贏得比賽。
例如N = 3。A只能拿1顆或2顆,所以B可以拿到最後1顆石子。(輸入的N可能為大數)
Input
第1行:一個數T,表示後面用作輸入測試的數的數量。(1 <= T <= 1000) 第2 - T + 1行:每行1個數N。(1 <= N <= 10^1000)
Output
共T行,如果A獲勝輸出A,如果B獲勝輸出B。
Input示例
3 2 3 4
Output示例
A B A
SG()打表:
#include<algorithm> #include<iostream> #include<cstdio> #include<cstring> using namespace std; int a[1002]; bool v[1002]; int sg[1002]; void init() { a[0]=1; for(int i=1;i<=32;i++) { a[i]=a[i-1]*2; } } void SG() { for(int i=1;i<=1000;i++) { memset(v,false,sizeof(v)); for(int j=0;a[j]<=i;j++) v[sg[i-a[j]]]=true; for(int j=0;j<=1000;j++) { if(v[j]==0) { sg[i]=j; break; } } } } int main() { int n; init(); SG(); scanf("%d",&n); while(n--) { if(sg[n]==0) cout<<"n="<<n<<"時:B"<<endl; else cout<<"n="<<n<<"時:A"<<endl; n--; } return 0; }
打表可以得到規律:
import java.util.Scanner; import java.io.*; import java.math.*; public class Main { //static String str[]=new String[100010]; public static void main(String args[]) { BigInteger n; int t; Scanner scan=new Scanner(System.in); t=scan.nextInt(); while(t>0) { n=scan.nextBigInteger(); if((n.mod(BigInteger.valueOf(3))).compareTo(BigInteger.ZERO)==0) { System.out.println("B"); }else { System.out.println("A"); } t--; } } }