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;
}
继续加油~
给一个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;
}
继续加油~
相关文章推荐
- 【2017 Multi-University Training Contest - Team 7 && hdu 6121】Build a tree
- 2017 Multi-University Training Contest 7 && HDU 6121 Build a tree 【思维】
- HDU 6121 Build a tree (递归+特判, 2017 Multi-Univ Training Contest 7)
- 2017 Multi-University Training Contest - Team 7:1002. Build a tree(递归)
- 2017 Multi-University Training Contest - Team 9 1001&&HDU 6161 Big binary tree【树形dp+hash】
- hdu 6069 Counting Divisors(约数个数)(2017 Multi-University Training Contest - Team 4 )
- hdu 6070 Dirt Ratio(二分+线段树)(2017 Multi-University Training Contest - Team 4 )
- 2017 Multi-University Training Contest - Team 4-hdu 6071 Lazy Running
- hdu 6071 Lazy Running(优先队列+dijkstra)(2017 Multi-University Training Contest - Team 4)
- 2017 Multi-University Training Contest - Team 9 1002&&HDU 6162 Ch’s gift【树链部分+线段树】
- hdu 6073 Matching In Multiplication(2017 Multi-University Training Contest - Team 4 )
- hdu 6143 容斥原理+多重集合的排列数 2017 Multi-University Training Contest - Team 8
- HDU 6093 Rikka with Number (2017 Multi-University Training Contest - Team 5)
- HDU-6033 Add More Zero - 2017 Multi-University Training Contest - Team 1(水之崩心态题)
- hdu 6034 Balala Power!(贪心)( 2017 Multi-University Training Contest - Team 1 )(无耻之sort)
- HDU-6103 Kirinriki - 2017 Multi-University Training Contest - Team 6(尺取)
- HDU 6038 Function(找规律)——2017 Multi-University Training Contest - Team 1
- HDU-6181 Two Paths(2017 Multi-University Training Contest - Team 10)
- hdu 6047 Maximum Sequence(2017 Multi-University Training Contest - Team 2)
- hdu 6045 Is Derek lying?(2017 Multi-University Training Contest - Team 2)