来源: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;
}