(博弈论 高精度小数)51NOD 1185 威佐夫游戏 V2
2024-08-30 16:31:41
有2堆石子。A B两个人轮流拿,A先拿。每次可以从一堆中取任意个或从2堆中取相同数量的石子,但不可不取。拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出2堆石子的数量,问最后谁能赢得比赛。
例如:2堆石子分别为3颗和5颗。那么不论A怎样拿,B都有对应的方法拿到最后1颗。
Input
第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10000)
第2 - T + 1行:每行2个数分别是2堆石子的数量,中间用空格分隔。(1 <= N <= 10^18)
Output
共T行,如果A获胜输出A,如果B获胜输出B。
Input示例
3
3 5
3 4
1 9
Output示例
B
A
A
解:众所周知,计算机表示的小数是一定程度内精确的,如本题(sqrt(5.0) + 1) / 2,double只精确到第16位(double保证15到16位有效数字,不是15到16位小数),而本题精度要求却在16位之后,所以我们需要找到更高精度的黄金比例,并且改进计算方式因为直接使用double还是会丢失精度。
#include<stdio.h> #define M (int)1e9 long long tmp[] = {,, }; //更精确的(sqrt(5.0) + 1) / 2的小数部分 int main()
{
int t;
while (scanf_s("%d", &t) != EOF)
{
while (t--)
{
long long a, b, temp, num[];
scanf_s("%lld%lld", &a, &b);
if (a < b)
{
temp = a;
a = b;
b = temp;
}
a -= b;
num[] = a / M;
num[] = a % M;
temp = tmp[] * num[];
temp = num[] * tmp[] + num[] * tmp[] + temp / M;
temp = num[] * tmp[] + num[] * tmp[] + temp / M;
temp = num[] * tmp[] + temp / M;
a += temp;
if (a == b) printf("B\n");
else printf("A\n");
}
}
return ;
}
最新文章
- RabbitMQ学习系列(三): C# 如何使用 RabbitMQ
- Android Activity 切换动画(非原创)
- [No00001B]到底如何培养语感?
- 2016年11月20日 星期日 --出埃及记 Exodus 20:11
- 数据库MySQL常用命令复习
- javascript之事件绑定
- mysql 5.6 General error: 1364 Field mysql 严格模式导致
- .net 伪静态、真静态 (mvc)
- Spark监控官方文档学习笔记
- Effective Java 第三版——17. 最小化可变性
- hbase性能优化总结
- C#当中的扩展方法
- vue 打包的项目当背景图路径错误
- Tomcat基本组件、其功能和处理请求的过程
- ElasticSearch - Node
- 论文笔记—Flattened convolution neural networks for feedforward acceleration
- shell 字符串提取数字
- 转 Appium for Mac 环境准备篇
- Nodejs异步框架——async
- 编译是报error: &#39;EVNET_COME_TO_FOREGROUND&#39; was not declared in this scope
热门文章
- Spring教程:tutorialspoint-spring
- 【SDCC讲师专访】PingCAP联合创始人兼CEO刘奇:好的产品应开源,不闭门造车-CSDN.NET
- weblogic集群的资料
- 转: 将Eclipse代码导入到AndroidStudio的两种方式
- iOS国际化:NSLocalizedString的使用
- 2016/05/10 thinkphp 3.2.2 ①系统常量信息 ②跨控制器调用 ③连接数据库配置及Model数据模型层 ④数据查询
- HTML5你必须知道的28个新特性
- [NOIP2012] day2 T3疫情控制
- MYSQL之数据库初窥
- mipi屏在内核可以显示logo但是u-boot无法显示的问题【转】