博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 P1290 欧几里德的游戏 题解
阅读量:4450 次
发布时间:2019-06-07

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

一、题目:

二、思路:

什么数论,什么欧几里得算法,都不需要!要的只是搜索和记忆化!

看到题,没思路。考虑了SG函数,太暴力。这么大的数据范围似乎过不去。索性打打试试!

woc!60分!这题数据好水水啊!

再一看,加个记忆化好像没毛病。交上去,A了!!!

这就是记忆化的重要性。

SG函数基本原理详见《算法竞赛进阶指南》\(P_{180}\)

三、代码:

/* * @Author: 岸芷汀兰 * @Date: 2018-10-31 22:18:01 * @LastEditors: 岸芷汀兰 * @LastEditTime: 2018-10-31 23:04:41 * @Description: P1290 of luogu */#include
#include
#include
#include
typedef long long LL;#define mem(s,v) memset(s,v,sizeof(s))using namespace std;template
inline Type read(void){ Type x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return f*x;}int m,n;map
,int>f;//用二维数组要爆空间,所以用map。bool solve(int a,int b){ if(a>b)a^=b^=a^=b; if(f.find(make_pair(a,b))!=f.end())return f[make_pair(a,b)]; if(b%a==0)return f[make_pair(a,b)]=true; for(register int k=1;a*k<=b;++k){ if(!solve(a,b-k*a))return f[make_pair(a,b)]=true; } return f[make_pair(a,b)]=false;}int main(){ int T=read
(); while(T--){ m=read
();n=read
(); if(solve(m,n))puts("Stan wins"); else puts("Ollie wins"); } return 0;}

转载于:https://www.cnblogs.com/little-aztl/p/9886531.html

你可能感兴趣的文章
类和对象-2
查看>>
使用UltraEdit+BCC5.5搭建C语言学习环境(转)
查看>>
485收发控制器:
查看>>
mssql死锁
查看>>
读取iOS plist文件 (其实类似读取xml文件)
查看>>
wps的几个优点
查看>>
Swift 可选链
查看>>
Servlet的入门案例
查看>>
获取请求参数乱码的问题
查看>>
代码实现:判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称...
查看>>
Android客户端测试点
查看>>
Jquery:怎样让子窗体的div显示在父窗体之上
查看>>
01概率
查看>>
.NET LINQ 元素操作
查看>>
51nod 1020
查看>>
Shell脚本
查看>>
MatLab Load cv::Mat 导入数据
查看>>
html+css相关笔记(一)
查看>>
基于块流协议保证音频优先发送
查看>>
关于互联网的一些数据
查看>>