您的位置:首页 > 产品设计 > UI/UE

HDU-6121 Build a tree - 2017 Multi-University Training Contest - Team 7(完全K叉树)

2017-08-16 23:38 459 查看
题意:

给一个n个节点的完全k叉树,每个节点的值为以其为根节点的子树的节点数。问所有节点的异或值是多少。

思路:

思路很好想,注意细节就好。

代码:

#include <bits/stdc++.h>
#define LL long long
using namespace std;
int key;
LL n, k, ans, yu_sum, sum, num, up_k;
LL qpow(LL bas, int b)
{
LL ans = 1;
while(b)
{
if(b&1) ans *= bas;
bas *= bas;
b >>= 1;
}
return ans;
}
LL xor_n(LL n)
{
LL t = n & 3;
if(t & 1) return t/2ll^1;
return t/2ll^n;
}
LL dfs(LL pre_sum, int deep)
{
LL now_sum = qpow(k, deep);
if(now_sum >= n-pre_sum) return n-pre_sum;
LL res = dfs(pre_sum+now_sum, deep+1);
if(key)
{
sum = num = res, yu_sum = res%k;
LL sl = res/k;
if(yu_sum) ++sl;
ans ^= (res+now_sum-sl)%2;
LL mn_num = num/k;
ans ^= (mn_num%2)*(k+1);
if(yu_sum) ans ^= yu_sum+1;
key = 0, res = 0, num /= k, up_k = k;
return res+now_sum;
}
LL mn_num = num/k; num /= k;
if(num) up_k *= k;
if(num == 0)
{
ans ^= (res/now_sum+sum+1);
ans ^= ((now_sum-1)%2)*(res/now_sum+1);
return res+now_sum;
}
if(now_sum == 1)
{
ans ^= (res+sum+1);
return res+now_sum;
}
LL geshu = (sum-yu_sum)/up_k;
if((sum-yu_sum)%up_k == 0)
{
ans ^= res/now_sum+yu_sum+1;
}
else
{
LL zans = (sum-yu_sum)-geshu*up_k;
ans ^= (res/now_sum+zans+yu_sum+1);
}
ans ^= (geshu%2)*(res/now_sum+up_k+1);
ans ^= ((now_sum-geshu-1)%2)*(res/now_sum+1);
return res+now_sum;
}
int main()
{
int t;
//freopen("in.txt", "r", stdin);
scanf("%d", &t);
while(t--)
{
scanf("%lld %lld", &n, &k);
ans = 0, key = 1, yu_sum = 0;
if(k != 1) dfs(0, 0);
else ans = xor_n(n);
printf("%lld\n", ans);
}
return 0;
}

继续加油~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐