博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ACdream 1112
阅读量:5907 次
发布时间:2019-06-19

本文共 2867 字,大约阅读时间需要 9 分钟。

Alice and Bob

Time Limit: 6000/3000MS (Java/Others)Memory Limit: 256000/128000KB (Java/Others)
Submit

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 itself or he can replace n with a and b.Here a*b = n and a > 1 and b > 1.For example, Alice can replace 6 with 2 or 3 or (2, 3).But he can’t replace 6 with 6 or (1, 6). But you can replace 6 with 1. After Alice’s turn, it’s Bob’s turn.Alice and Bob take turns to do so.Who can’t do any replace lose the game.

Alice and Bob are both clever enough. Who is the winner?

Input

This problem contains multiple test cases. The first line contains one number n(1 <= n <= 100000).

The second line contains n numbers.

All the numbers are positive and less than of equal to 5000000.

Output

For each test case, if Alice can win, output “Alice”, otherwise output “Bob”.

Sample Input

22 232 2 4

Sample Output

BobAlice

Source

yehuijie

Manager

给出n个数,两个轮流任选一个数n进行操作,第一种操作是将该数变为他的一个因子,但是不能变为本身。
第二种是变成两个数a和b,要满足a * b = n。a>1, b>1.
第一次写线性筛,这个算法和普通的筛法略有不同,也更不好理解一点,就是说算法保证每个数只会被
他的最小的质因子筛去。也保证了算法的时间是线性的。
Accepted Code:
/*************************************************************************    > File Name: 1112.cpp    > Author: Stomach_ache    > Mail: sudaweitong@gmail.com    > Created Time: 2014年09月05日 星期五 11时35分09秒    > Propose:  ************************************************************************/#include 
#include
#include
#include
#include
#include
#include
#include
using namespace std;/*Let's fight!!!*/const int MAX_N = 5000005;int n, pnum, p[MAX_N], mindiv[MAX_N], cnt[MAX_N];bool vis[MAX_N];//线性筛,可以很方便的保存每个数最小的质因子,//和每个数不同质因子的个数void get_prime(int n) { pnum = 0; vis[1] = true; cnt[1] = 0; for (int i = 2; i <= n; i++) { if (!vis[i]) { p[pnum++] = i; mindiv[i] = i; cnt[i] = 1; } for (int j = 0; j < pnum; j++) { if (p[j] * i > n) break; vis[p[j] * i] = true; mindiv[p[j] * i] = p[j]; cnt[p[j] * i] = cnt[i] + 1; if (i % p[j] == 0) break; } }}//记忆化搜索所用数组,初始化为-1int sg[35];int dfs(int n) { if (sg[n] != -1) return sg[n]; set
S; //第一种转移变为因子a for (int i = 0; i < n; i++) S.insert(dfs(i)); //第二种转移变为两个因子a * b for (int i = 1; i < n; i++) S.insert(dfs(i)^dfs(n - i)); int g = 0; while (S.find(g) != S.end()) g++; return sg[n] = g;}void get_SG() { get_prime(5000000); memset(sg, -1, sizeof(sg)); sg[0] = 0; for (int i = 1; i <= 33; i++) { sg[i] = dfs(i); }}int main(void) { get_SG(); //预处理sg值 int n; while (~scanf("%d", &n)) { int ans = 0; for (int i = 0; i < n; i++) { int x; scanf("%d", &x); ans ^= sg[cnt[x]]; } if (ans) puts("Alice"); else puts("Bob"); } return 0;}

 

转载于:https://www.cnblogs.com/Stomach-ache/p/3958143.html

你可能感兴趣的文章
OOM killer(Out Of Memory killer)
查看>>
(转)从最大似然估计开始,你需要打下的机器学习基石
查看>>
目前机器学习和深度学习能做些什么?
查看>>
一些你可能需要的okhttp实现
查看>>
RN与android原生开发混合后的环境报错问题
查看>>
arcengine cliasic code(转)基于ArcGIS Engine + C#实现用户自定义动态电力符号
查看>>
C# 应用微软的Visual Studio International Pack 类库提取汉字拼音首字母[转]
查看>>
Latex 学习
查看>>
SQL Server中DateTime与DateTime2的区别
查看>>
Codekit - 为Web前端打造的全能型神器(附推荐各种工具)
查看>>
java 截取字符串 拆分字符串
查看>>
从零开始学C++之数据封装与抽象:分别用C和C++来实现一个链栈
查看>>
[置顶] IT老男人读《因为痛,所以叫青春》
查看>>
Android NDK学习(3)使用Javah命令生成JNI头文件 .
查看>>
poj2186Popular Cows(Kosaraju算法--有向图的强连通分量的分解)
查看>>
LR基础学习_脚本信息函数
查看>>
基于html5 canvas和js实现的水果忍者网页版
查看>>
2、传统的线程互斥synchronized
查看>>
IT忍者神龟之使用 PowerDesigner
查看>>
JSP导出Excel文件
查看>>