ACdream 1112 Alice and Bob (博弈&&素数筛选优化)

题目链接:传送门

游戏规则:

没次能够将一堆分成两堆 x = a*b (a!=1&&b!=1)x为原来堆的个数,a,b为新堆的个数。

也能够将原来的堆的个数变成原来堆的约数y。y!=x。进行最后一次操作的人获胜。

分析:

也是一个去石头的游戏,因此我们仅仅须要将全部情况的sg值异或起来就好了。

我们首先来考虑一堆。设这一堆的个数为x;

那么全部的情况就是

(a1,x/a1), (a2,x/a2),...,(an,x/an);或者(a1),(a2),..,(an)。

由于数据量比較大,我们朴素的找约数肯定会超时。

然后细致分析一下这个问题。由于我

们都是环绕着约数来进行操作。那么也就相当于在对他的素因子的个数进行操作。

x=a1^r1*a2^r2*...*an^rn;设sum = r1+r2+...+rn.

然后全部的情况就能够表示为:

(1,sum-1),(2,sum-2),...(sum/2,sum-sum/2)或者(1),(2),...(n-1)

这样就大大减小了数据的范围。然后在计算sum的时候我们能够这样计算。

设一个数为x,他的最小的素因子为y.则sum[x] = sum[x/y] + 1;

代码例如以下:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;

const int maxn = 5000010;

int prime[maxn],cnt;
bool isprime[maxn];
int fac_num[maxn];
int min_fac[maxn];

int sg[100];

void GetPirme(){
    cnt=0;
    memset(isprime,0,sizeof(isprime));
    memset(fac_num,-1,sizeof(fac_num));
    memset(min_fac,-1,sizeof(min_fac));
    for(int i=2;i<maxn;i++){
        if(!isprime[i]){
            prime[cnt++]=i;
            for(int j=i+i;j<maxn;j+=i){
                isprime[j]=1;
                if(min_fac[j]==-1)
                    min_fac[j]=i;
            }
            min_fac[i]=i;
        }
    }
}

int get_num(int x){
    if(x==1) return 0;
    if(fac_num[x]!=-1) return fac_num[x];
    return fac_num[x]=get_num(x/min_fac[x])+1;
}

int Get_Sg(int x){
    if(sg[x]!=-1) return sg[x];
    bool vis[100];
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=x;i++) vis[Get_Sg(x-i)]=1;
    for(int i=1;i<=x/2;i++)
        vis[Get_Sg(i)^Get_Sg(x-i)]=1;
    for(int i=0;;i++){
        if(!vis[i]){
            return sg[x]=i;
        }
    }
}

void init(){
    GetPirme();
    memset(sg,-1,sizeof(sg));
    sg[0]=0;
}

int main()
{
    init();
    int n;
    while(~scanf("%d",&n)){
        int x ,ans=0;
        for(int i=0;i<n;i++){
            scanf("%d",&x);
            //cout<<"num: "<<get_num(x)<<endl;
            ans^=Get_Sg(get_num(x));
        }
        if(ans) puts("Alice");
        else puts("Bob");
    }
    return 0;
}
时间: 2024-12-24 21:33:52

ACdream 1112 Alice and Bob (博弈&amp;&amp;素数筛选优化)的相关文章

ACdream 1112 Alice and Bob (博弈&amp;&amp;素数筛选优化)

题目链接:传送门 游戏规则: 没次可以将一堆分成两堆 x = a*b (a!=1&&b!=1)x为原来堆的个数,a,b为新堆的个数. 也可以将原来的堆的个数变成原来堆的约数y,y!=x.进行最后一次操作的人获胜. 分析: 也是一个去石头的游戏,因此我们只需要将所有情况的sg值异或起来就好了. 我们首先来考虑一堆.设这一堆的个数为x: 那么所有的情况就是 (a1,x/a1), (a2,x/a2),...,(an,x/an);或者(a1),(a2),..,(an). 由于数据量比较大,我们朴素

ACdream 1112 Alice and Bob(素筛+博弈SG函数)

Alice and Bob Time Limit:3000MS     Memory Limit:128000KB     64bit IO Format:%lld & %llu Submit Status Practice ACdream 1112 Description Here  is Alice and Bob again ! Alice and Bob are playing a game. There are several numbers. First, Alice choose

ACdream 1112 Alice and Bob (sg函数的变形+素数筛)

题意:有N个数,Alice 和 Bob 轮流对这些数进行操作,若一个数 n=a*b且a>1,b>1,可以将该数变成 a 和 b 两个数: 或者可以减少为a或b,Alice先,问谁能赢 思路:首先单看对每个数进行除法的操作,我们可以知道其实是在除以每个数的素因子或素因子之间的积 比如 70=2*5*7 我们可以变成 10(2*5)或 14(2*7) 或 35(5*7)或 2 或 5 或 7 或 1 这七种状态 当我们把他们(2,5,7)当作3个石子也就是一堆时,然而实际上我们是将这堆石子进行ni

UVA 1500 - Alice and Bob(博弈)

UVA 1500 - Alice and Bob 题目链接 题意:alice和bob这对狗男女play a game,黑板上有n个数字,每次能把一个数字减1,或者把两个数字合成一个数字,值为两数的和,数字减到0就自动被擦去,最后不能操作的算输,alice先手,问最后谁赢 思路:博弈问题,首先想到一点就很好办了,就是对于非1的所有数,肯定会优先去合并成一个数字的,因为如果当前状态能胜,我优先合并掉,对手不管做什么都无法阻止.然后利用必胜态必败态去进行dp,dp[i][j]记录是有i个1,在非1的堆

HDU 4111 Alice and Bob (博弈)

Alice and Bob Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1799    Accepted Submission(s): 650 Problem Description Alice and Bob are very smart guys and they like to play all kinds of games i

Codeforces 346A Alice and Bob 博弈

http://codeforces.com/problemset/problem/346/A 题意:A和B两个人进行游戏,每人轮流操作,每次从集合(集合元素个数n<=100)取出两个数x,y将|x-y|放入集合中 (|x-y|不存在集合中)不能操作则输 最终游戏结束的标志是无法取出两个数字,他们的差值不在序列中.也就是说,最终状态是一个首项等于公差的等差序列.求出这个等差数列的项数-n,就是游戏进行的回合. 所以我们要先求出首项.设首项为d,接下来就是d+d,d+2d-.后面几项都是首项的倍数

ACdream群赛1112(Alice and Bob)

题意:http://acdream.info/problem?pid=1112 Problem Description Here  is Alice and Bob again ! Alice and Bob are playing a game. There are several numbers.First, Alice choose a number n.Then he can replace n (n > 1)with one of its positive factor but not

博弈问题-Alice与Bob拿牌游戏

Description Bob and Alice play a game, and Bob will play first. Here is the rule of the game: 1) There are N stones at first; 2) Bob and Alice take turns to remove stones. Each time, they can remove p^k stones. p is prime number, such as 2, 3, 5, ...

ZOJ 3529 A Game Between Alice and Bob (分解质因数+Nim博弈)

A Game Between Alice and Bob Time Limit: 5 Seconds      Memory Limit: 262144 KB Alice and Bob play the following game. A series of numbers is written on the blackboard. Alice and Bob take turns choosing one of the numbers, and replace it with one of