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;
}
ACdream 1112 Alice and Bob (博弈&&素数筛选优化)的更多相关文章
- ACdream 1112 Alice and Bob(素筛+博弈SG函数)
Alice and Bob Time Limit:3000MS Memory Limit:128000KB 64bit IO Format:%lld & %llu Submit ...
- ACdream 1112 Alice and Bob (sg函数的变形+素数筛)
题意:有N个数,Alice 和 Bob 轮流对这些数进行操作,若一个数 n=a*b且a>1,b>1,可以将该数变成 a 和 b 两个数: 或者可以减少为a或b,Alice先,问谁能赢 思路 ...
- ZOJ 3529 A Game Between Alice and Bob 博弈好题
A Game Between Alice and Bob Time Limit: 5 Seconds Memory Limit: 262144 KB Alice and Bob play t ...
- UVaLive 5760 Alice and Bob (博弈 + 记忆化搜索)
题意:有 n 堆石子,有两种操作,一种是从一堆中拿走一个,另一种是把两堆合并起来,Alice 先拿,谁不能拿了谁输,问谁胜. 析:某些堆石子数量为 1 是特殊,石子数量大于 1 个的都合并起来,再拿, ...
- HDU 4111 Alice and Bob (博弈+记忆化搜索)
题意:给定 n 堆石头,然后有两种操作,一种是把从任意一堆拿走一个,另一种是把一个石子放到另一堆上. 析:整体看,这个题真是不好做,dp[a][b] 表示有 a 堆1个石子,b个操作,操作是指把其他的 ...
- BZOJ 3895 3895: 取石子 / Luogu SP9934 ALICE - Alice and Bob (博弈 记忆化搜索)
转自PoPoQQQ大佬博客 题目大意:给定n堆石子,两人轮流操作,每个人可以合并两堆石子或拿走一个石子,不能操作者输,问是否先手必胜 直接想很难搞,我们不妨来考虑一个特殊情况 假设每堆石子的数量都&g ...
- ACdream群赛1112(Alice and Bob)
题意:http://acdream.info/problem?pid=1112 Problem Description Here is Alice and Bob again ! Alice and ...
- Alice and Bob(博弈)
Alice and Bob Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit users ...
- Foj 2296 Alice and Bob(博弈、搜索)
Foj 2296 Alice and Bob 题意 两个人博弈,规则如下:轮流取0~9中的数字,最后Alice所得的数字个数为1~n中,数位在Alice所取集合中出现奇数次的. 双方想获得尽量多,问A ...
随机推荐
- 如何解决error LNK2001(转载)
转自:http://www.cnblogs.com/myzhijie/articles/1658545.html 解决外部符号错误:_main,_WinMain@16,__beginthreadex ...
- hibernate annotation 之 一对多、多对一双向外键关联
假设,一个农场产出多种植物,具体的某一植物产于某一农场. 3 import java.io.Serializable; 4 import java.util.Set; 5 import javax.p ...
- 如何用putty链接服务器端,并安装wdcp
首先把自己阿里云的磁盘格式化然后重启 自己下载一个PuTTY 打开后输入自己的Ip地址端口号默认是22 会跳出一个yes 跟no界面,点击yes 会进入一个类似cmd界面 直接输入root,然后会提示 ...
- Robomongo 0.9.0 连接mongo数据库时,提示连接失败 的解决方案
Robomongo 0.9.0 连接mongo数据库时,提示连接失败.(IP和端口号确定是对的) 基本注意点: 1.mongodb服务打开,打开时,指定端口号,默认为27017,使用默认值,则不用指定 ...
- Tcl之looping
1 While loop while test body The while command evaluates test as an expression. If test is true, the ...
- css图片高清适配
同一张图片,在普通屏显示正常,但高清屏出现模糊.原因是原来一个像素的点分成的四个像素的点进行了显示. 解决方案:在高清屏中把图片变成二倍图,前提是二倍的高清图已经存在. .icon{ backgrou ...
- CAD动态绘制多段线(com接口)
主要用到函数说明: _DMxDrawX::DrawLine 绘制一个直线.详细说明如下: 参数 说明 DOUBLE dX1 直线的开始点x坐标 DOUBLE dY1 直线的开始点y坐标 DOUBLE ...
- js案例分析
名字取的高大上,其实只是我平时上网浏览遇到的一些我感觉还不错的小题目,再加上我或者是我在网上找到的一些理解,就保存到这里了. 2019/4/2 最新开了个新坑,是一个javascipt30的一些案例 ...
- Sprinboot优雅配置监听,并记录所有启动事件
在阅读Springboot启动源码的时候,发现Springboot自动启动listeners是通过uopeizhi文件配置的,本文就是采用Springboot方式自动装入listeners. 项目依赖 ...
- Lua中返回值的丢失问题
Lua中返回值的丢失问题 -- 如果函数调用所得的多个返回值是另外一个函数的最后一个参数,或者是多指派表达式中的最后一个参数时,所有返回值将被传入或使用. -- 否则只有第一个返回值被使用或指定. T ...