题目链接:http://codeforces.com/problemset/problem/255/E
题意:n堆石子,每次从一堆(设这堆的石子数为x)中必须拿到剩下y个,y满足:0<=y<x,且y*y*y*y>=x且y*y<=x。
思路:求每个状态的SG函数。
const int MAX=900005;
int SG[MAX],sum[4][MAX],visit[MAX];
i64 sqrt4(i64 x)
{
i64 low=0,high=1000,mid;
while(low<=high)
{
mid=(low+high)>>1;
if(sqr(sqr(mid))>=x) high=mid-1;
else low=mid+1;
}
if(sqr(sqr(high))>=x) return high;
return low;
}
i64 sqrt2(i64 x)
{
i64 low=0,high=10000000,mid;
while(low<=high)
{
mid=(low+high)>>1;
if(sqr(mid)>x) high=mid-1;
else low=mid+1;
}
if(sqr(low)>x) return high;
return low;
}
void init()
{
SG[0]=0;
clr(visit,-1);
int i,j,k=0;
for(i=1;i<MAX;i++)
{
for(j=sqrt4(i);j*j<=i&&j<i;j++) visit[SG[j]]=k;
SG[i]=0;
while(visit[SG[i]]==k) SG[i]++;
k++;
}
for(i=MAX-2;i>=0;i--)
{
for(j=0;j<4;j++) sum[j][i]=sum[j][i+1];
sum[SG[i]][i]++;
}
}
int getSG(i64 x)
{
if(x<MAX) return SG[x];
i64 L=sqrt4(x),R=sqrt2(x),t=0;
while(t<4&&sum[t][L]-sum[t][R+1]) t++;
return t;
}
int n;
int main()
{
init();
scanf("%d",&n);
i64 x,ans=0;
while(n--)
{
cin>>x;
ans^=getSG(x);
}
if(ans) puts("Furlo");
else puts("Rublo");
return 0;
}