hdu 6121 Build a tree

来源:互联网 发布:漫画下载软件 编辑:程序博客网 时间:2024/06/05 17:54

对于树的每一层,我们可以分为三种节点,①满节点的k叉树②不满的k叉树③比第一种情况少一层的满节点的k叉树,然后从叶子节点开始不断转移到上一层。

对于k=1进行特判,打表找规律。。。。真TM刺激。。。爽的不行不行的,感觉看了题解是很容易,但是自己去想,一步步不出错,还是要有一定的脑洞的

#include<bits\stdc++.h>using namespace std;typedef long long ll;int main(){int t;scanf("%d",&t);while(t--){    ll n,k;    cin>>n>>k;    if(k==1)    {         ll tt=n%4;           if(tt==1)printf("1\n");           else if(tt==2)printf("%lld\n",n+1);           else if(tt==3)printf("0\n");           else printf("%lld\n",n);    continue;    }    ll s,remain,a,b,c;    a=b=c=0;    s=k;    ll sum=1,flag=0;    while(sum+s<=n)    {        sum+=s;      if((double)s>1e18/(double)k)//可能会越界,            {                flag=1;                break;            }        s*=k;    }    remain=n-sum;    ll vala,valb,valc;    vala=k+1;    valb=(remain%k)==0?0:remain%k+1;    valc=1;    a=remain/k;    b=remain%k==0?0:1;    if(flag==0)s/=k;    c=s-a-b;    ll ans=remain%2;    while(a+b+c>1)    {        if(a%2)ans^=vala;        if(b%2)ans^=valb;        if(c%2)ans^=valc;        if(a%k||c%k)b=1;        valb=a%k*vala+(k-b-a%k)*valc+1+valb;        a/=k;        vala=k*vala+1;        c/=k;        valc=k*valc+1;    }    cout<<(ans^n)<<endl;}    return 0;}


原创粉丝点击