博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ACdream 1112 Alice and Bob (博弈&&素数筛选优化)
阅读量:7126 次
发布时间:2019-06-28

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

题目链接:

游戏规则:

没次能够将一堆分成两堆 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 
#include
#include
#include
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

 

转载地址:http://pahel.baihongyu.com/

你可能感兴趣的文章
小X与缩写
查看>>
第一次团队会议
查看>>
018-请你说一下设计测试用例的方法
查看>>
android 链接mysql数据库
查看>>
CAKeyframeAnimation 旋转动画
查看>>
学习python的第二天
查看>>
深入详解SQL中的Null
查看>>
c#国际化
查看>>
java代码Calendar类
查看>>
java多线程实现礼花绽放的效果,
查看>>
算法提高 道路和航路 SPFA 算法
查看>>
POJ2449 第K短路
查看>>
【最小割】【网络流24题】【P2762】 太空飞行计划问题
查看>>
Mysql触发器示例
查看>>
解决Asp.net中的Chart控件运行出现错误提示“ ChartImg.axd 执行子请求时出错”
查看>>
PHPExcel类导出xlsx文件 提示格式不兼容 低版本excel软件打不开 解决方案
查看>>
Android开发规范
查看>>
心已落定,入驻博客园
查看>>
paper 84:机器学习算法--随机森林
查看>>
Python自动化运维之26、Web框架本质、MVC与MTV
查看>>