Vijos P1554 硬币游戏(ZJOI2009)题解

来源:互联网 发布:七月算法 编辑:程序博客网 时间:2024/05/21 09:17

从网上摘抄的代码,但研究了半天不知道原理,但仍在此放出,希望各位帮忙解释一下原理。

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define M 100100using namespace std;typedef long long ll;int n,tot;ll m;char a[2][M],ans[M<<1];int main(){    int x;    cin>>n>>m;    for(int i=1;i<=n;i++)        scanf("%d",&x),a[0][i]=x-1;    for(ll j=2;j<=m;j<<=1)    {        if(m & j)        {            ++tot;                       for(int i=1;i<=n;i++)                        {                                int x=(i+(j>>1)%n+n-1)%n+1;                                int y=(i-(j>>1)%n+n-1)%n+1;                                a[tot&1][i]=a[~tot&1][x]^a[~tot&1][y];            }                }        }    for(int i=1;i<=n;i++)        ans[i+i-1]=a[tot&1][i];        if(m & 1)        {                for(int i=1;i<=n;i++)                    ans[i<<1]=ans[i+i-1]^ans[i==n?1:i<<1|1];               for(int i=1;i<=n;i++)                        ans[i+i-1]=-1;        }        else        {                for(int i=1;i<=n;i++)                        ans[i+i]=-1;        }        for(int i=1;i<=n<<1;i++)        printf("%d%c",ans[i]+1,i==n+n?'\n':' ');}  
0 0
原创粉丝点击