一道贼难的递推
据说还是浙江省选
题目大意是这样:
在桌子的边缘上划分出
然后问你操作
首先很容易发现,设正面朝上为
然后开始枚举找规律
发现经过
然后继续延伸,可得到这样一个结论:
即第i枚硬币的值为它左边第
然后就很简单了,把
需要注意的是
最后输出就可以了,总时间复杂度为
code:
#include<stdio.h>
int n,k;
long long t;
int ans[201010],a[2][101010];
int main()
{
scanf("%d%lld",&n,&t);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[0][i]);
a[0][i]--;
}
for(int j=1;(1ll<<j)<=t;j++)
{
if(t&(1ll<<j))
{
long long p=(1ll<<j);
for(int i=1;i<=n;i++)
{
long long x=(i-(p>>1)%n+n-1)%n+1;
long long y=(i+(p>>1)%n+n-1)%n+1;
a[k^1][i]=a[k][x]^a[k][y];
}
k^=1;
}
}
for(int i=1;i<=n;i++)
ans[2*i-1]=a[k][i];
if(t&1)
{
for(int i=1;i<=n;i++)
ans[2*i]=ans[2*i-1]^ans[i==n?1:(2*i+1)];
for(int i=1;i<=n;i++)
ans[2*i-1]=-1;
}
else
for(int i=1;i<=n;i++)
ans[2*i]=-1;
for(int i=1;i<=2*n;i++)
printf("%d ",ans[i]+1);
return 0;
}