hdu 6121 分治+思维

来源:互联网 发布:绘声绘影软件免费下载 编辑:程序博客网 时间:2024/06/07 06:20
#include<bits/stdc++.h>using namespace std;typedef long long ll;ll table[105],help[105],n,k,res;int depth;void init(){    table[1]=help[1]=1;    for(int i=2;i<=depth;i++)    {        help[i]=help[i-1]*k;        table[i]=table[i-1]+help[i];    }}int main(){    //freopen("C:\\Users\\Со·І\\Desktop\\КэѕЭ\\1002.in","r",stdin);    int t,i,j;    ll node;    scanf("%d",&t);while(t--&&scanf("%lld%lld",&n,&k)!=EOF)    {        if(k==1)        {            int tp=n%4;            if(!tp)                res=n;            else if(tp==1)                res=1;            else if(tp==2)                res=n+1;            else                res=0;        }        else        {            depth=0;            res=n;            for(ll m=n;m;m=(m-1+k-1)/k)                depth++;            init();            res^=(n-table[depth-1])&1;            node=(n-2)/k;            depth--;            for(int now=2;node;node=(node-1)/k,depth--,now++)            {                ll l=table[depth-1],r=table[depth]-1;                res^=((node-l)&1)*table[now];                res^=((r-node)&1)*table[now-1];                ll lnode=node;                while(lnode<=(n-2)/k)                    lnode=lnode*k+1;                res^=table[now-1]+n-lnode;            }        }        printf("%lld\n",res);}return 0;}

原创粉丝点击