龙珠游戏-博弈之斐波那契数列

来源:GZHU-Problem 1516
校园内网-传送门

Problem Description

终于!你集齐了七颗龙珠!

你使用七颗龙珠召唤了神龙,想要许一个愿望。

【我的愿望是,请给我一个laop。。】

〖你的龙珠不够啊〗,神龙摇了摇头。

。。。

不够?

稍等

桥豆麻袋

不是说是七颗吗?

〖不是啊,一共有9223372036854775807颗啊〗

【wtf。。。】

神龙看你也怪可怜了,都这个岁数了还没有女朋友,于是提出了一个条件。

〖这样吧,我这里有一部分龙珠,一共是n颗。我们来玩个游戏。我们轮流取龙珠,每个人每次最少取1颗,最多不能超过上一个人的取的龙珠数的2倍。如果轮到谁没得取了那个人就算输。你要是赢了我我就满足你的一个愿望〗

【谁先手?】

〖你先手吧。〗

【那我第一次全取了不就必定能赢吗?快点给我laop。。】

〖啊不不不,第1个人只能取最多n-1颗〗

【那要是你的n=1。。。】

〖神龙不会那么穷的,放心〗

在那之前,你,身为圣广州皇家综合大学的学生,立刻就意识到,只要你知道n是多少,你就可以知道你能不能够赢。于是你偷偷数了一下神龙的龙珠数,知道了n。

现在,你需要判断你是否能够赢。

为什么要这么做呢,因为如果你必定不能赢的话为什么还要浪费时间玩这个游戏呢。

不如把神龙打一顿解解气。

Input

第一行有一个整数t,表示数据组数。

接下来的t行,每行有一个整数n,表示龙珠的个数。

t<=10000,n>=2且n在long long范围内。

Output

对于每组数据,如果你存在必胜策略可以保证必定可以得到神龙的祝福,则输出"Win!"。

否则输出"Lose…"

Sample Input

2
2
6

Sample Output

Lose…
Win!

Hint

你最终输掉了游戏。

你想打神龙一顿,却发现神龙早已消失。

你发现你的龙珠也没有了。

你顿时觉得你的人生十分的悲惨。

而且还没有女朋友。

题解

看到每次选择数的大小,不大于上一个数的2倍,在我们已学的数学模型中就应该联想到斐波那契数列数列,经过观察和几次递推就可以知道,只要不是斐波那契数列上的数就会输

#pragma GCC optimize(2)
#include<bits/stdc++.h> 
using namespace std;
#define endl "\n" 
#define ll long long
const double pi=acos(-1);
ll f[101],cnt=1,M=LLONG_MAX;
signed main(){
    ios_base::sync_with_stdio(0);cin.tie(0),cout.tie(0);
	f[0]=f[1]=1;
	while(1){
		if(M-f[cnt]>f[cnt-1]){  //选出在long long范围内的斐波那契数
			f[cnt+1]=f[cnt]+f[cnt-1];
			cnt++;
		}
		else break;
	}
	int t;cin>>t;
	while(t--){
		ll n;cin>>n;
		int k=lower_bound(f,f+cnt,n)-f; //在f[]中二分查找特判查找不是有这个数
		cout<<(f[k]!=n?"Win!":"Lose...")<<endl;
	}
   return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值