Zoj 3529 A Game Between Alice and Bob 数论+博弈Nim 快速求数中有多少个素数因子
本题涉及博弈论中的Nim游戏博弈。
Nim游戏博弈详解链接:
http://www.cnblogs.com/exponent/articles/2141477.html
本题解题报告详解链接:
http://blog.csdn.net/woshi250hua/article/details/7824609
我的代码,写的较挫,4000多ms,压着时间过,时间限制是5s.我预处理了所有1-5*10^6的数的素因子个数,用的是dp
的思想,先预处理1-5*10^6的数的最小素因子,存在a数组中,然后dp[i] = dp[i/a[i] ]+1;
我觉得我代码最挫的地方是在求最小素因子时费时太多。。。。
#include <cstdio>
#define N 5000005
#define INF 0x7fffffff
int p[N];//每个数有多少个素数因子
int a[N];//每个数最小的素数因子
int prime[];//存素数表
void init()
{
//打素数表,求出1-5005以内的素数和每个数的最小质因子
for(int i=; i<; ++i)
prime[i] = INF;
prime[] = ;
int num = ;
for(int i=; i<; ++i)
{
int x = ;
while(i%prime[x] && prime[x] <= i) ++x;
if( !(i%prime[x]) )
a[i] = prime[x];
else
{
prime[++num] = i;
a[i] = i;
}
}
a[] =;
for(int i=; i< N; ++i)
{
int x = ;
while(i%prime[x] && prime[x] <= i) ++x;
if( !(i%prime[x]) )
a[i] = prime[x];
else
a[i] = i;
}
p[] = ;
for(int i=; i <N; ++i)
p[i] = p[i/a[i]] + ;
}
int main()
{
// freopen("in.cpp","r",stdin);
init();
int n;
int b[];
int t=;
while(scanf("%d",&n) != EOF)
{
int ans ;
for(int i=; i<n; ++i)
{
scanf("%d",&b[i]);
if(i)
ans ^= p[b[i]];
else
ans = p[b[i]];
}
printf("Test #%d: ",++t);
if(ans)
{
int index;
for(int i=; i<n; ++i)
if( (p[b[i]]^ans) < p[b[i]] )
{
index = i+;
break;
}
printf("Alice %d\n",index);
}
else printf("Bob\n");
}
return ;
}
这是改进后的代码,用线性筛法在打素数表的同时求出最小素因子····
初始化时每个数的最小素因子就是本身。
#include <cstdio>
#define N 5000005
#define INF 0x7fffffff
int p[N];//每个数有多少个素数因子
bool v[N]; //是否为素数
int a[N];//每个数最小的素数因子
int prime[N/];//素数表
//用打素数表的筛法求每个数的最小质因子
void init()
{
for(int i=; i<N; ++i)
a[i] = i;
int num=-;
for(int i=; i<N; ++i)
{
if(!v[i]) prime[++num] = i;
for(int j=; j<=num && i*prime[j] < N; ++j)
{
int t = i*prime[j];
v[t] =;
if(a[t] > prime[j]) a[t] = prime[j];
if(i%prime[j] == ) break;
}
}
p[] = ;
for(int i=; i <N; ++i)
p[i] = p[i/a[i]] + ;
} int main()
{
// freopen("in.cpp","r",stdin);
init();
int n;
int b[];
int t=;
while(scanf("%d",&n) != EOF)
{
int ans ;
for(int i=; i<n; ++i)
{
scanf("%d",&b[i]);
if(i)
ans ^= p[b[i]];
else
ans = p[b[i]];
}
printf("Test #%d: ",++t);
if(ans)
{
int index;
for(int i=; i<n; ++i)
if( (p[b[i]]^ans) < p[b[i]] )
{
index = i+;
break;
}
printf("Alice %d\n",index);
}
else printf("Bob\n");
}
return ;
}
Zoj 3529 A Game Between Alice and Bob 数论+博弈Nim 快速求数中有多少个素数因子的更多相关文章
- ZOJ 3529 A Game Between Alice and Bob(博弈论-sg函数)
ZOJ 3529 - A Game Between Alice and Bob Time Limit:5000MS Memory Limit:262144KB 64bit IO For ...
- 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 ...
- zoj 3529 A Game Between Alice and Bob 博弈论
思路:每个数的SG值就是其质因子个数,在进行nim博弈 代码如下: #include<iostream> #include<cstdio> #include<cmath& ...
- 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 ...
- HDU 5708 Alice and Bob (博弈,找规律)
题意: 一个无限大的棋盘,一开始在1,1,有三种移动方式,(x+1,y)(x,y+1) (x+k,y+k)最后走到nm不能走了的人算输.. 析:.我们看成一开始在(n,m),往1,1,走,所以自然可以 ...
- 2011 ACM-ICPC 成都赛区A题 Alice and Bob (博弈动规)
题目大意: 有K堆石子,每堆有Ki个.两人的操作能够是: 1 从某一堆拿走一个 假设该堆在此之后没有石子了.就消失 2 合并两个堆 求是否 ...
- ZOJ 3757 Alice and Bob and Cue Sports(模拟)
题目链接 题意 : 玩台球.Alice 和 Bob,一共可以进行m次,Alice 先打.有一个白球和n个标有不同标号的球,称目标球为当前在桌子上的除了白球以外的数值最小的球,默认白球的标号为0.如果白 ...
- 2014 Super Training #6 A Alice and Bob --SG函数
原题: ZOJ 3666 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3666 博弈问题. 题意:给你1~N个位置,N是最 ...
随机推荐
- C#匹配中文
public static bool ContainsChinese(string text) { if (string.IsNullOrEmpty(text)) return false; stri ...
- Freemarker生成HTML静态页面
这段时间的工作是做一个网址导航的项目,面向用户的就是一个首页,于是就想到了使用freemarker这个模板引擎来对首页静态化. 之前是用jsp实现,为了避免用户每次打开页面都查询一次数据库,所以使用了 ...
- Python处理HTML转义字符
抓网页数据经常遇到例如>或者 这种HTML转义符,抓到字符串里很是烦人. 比方说一个从网页中抓到的字符串: html = '<abc>' 用Python可以这样处理: import ...
- 【转】ArcGIS API for Silverlight/WPF 2.1学习笔记(五)
2.Find示例代码 (1)xaml文件: //添加Symbol命名空间 xmlns:esriSymbols="clr-namespace:ESRI.ArcGIS.Client.Symbol ...
- 2018焦作网络赛Give Candies
一开始忽略了欧拉定理指数部分是modphi(n-1)没有memset,减法后面没加0:
- codeforces 487a//Fight the Monster// Codeforces Round #278(Div. 1)
题意:打怪兽.可增加自己的属性,怎样在能打倒怪兽的情况下花费最少? 这题关键要找好二分的量.一开始我觉得,只要攻击到101,防御到100,就能必胜,于是我对自己的三个属性的和二分(0到201),内部三 ...
- 部署Spring web项目遇到的问题及解决方案
非常悲伤的一个提示: 错误源码: Caused by: java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExce ...
- SQL2005 安装问题
1. 单击“开始”,依次指向“程序”.“Microsoft SQL Server 2005”和“配置工具”,然后单击“SQL Server 外围应用配置器”. 2. 在“SQL Server 2005 ...
- Oracle12c新特性之基本操作
1. 服务器端连接并启动数据库: sqlplus / as sysdba startup; 2. 服务器端连接并关闭数据库: sqlplus / as sysdba shutdown immedi ...
- Centos7上部署openstack mitaka配置详解(将疑难点都进行划分)
在配置openstack项目时很多人认为到处是坑,特别是新手,一旦进坑没有人指导,身体将会感觉一次次被掏空,作为菜鸟的我也感同身受,因为已经被掏空n次了. 以下也是我将整个openstack配置过程进 ...