//hdu 5593 树形dp
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <vector>
#define LL long long
#define maxn 500005
using namespace std;
int dp[maxn][15];
int k,n;
vector<int> g[maxn];
void dfs(int a)
{
dp[a][0]=1;
for(int i=0;i<g[a].size();i++)
{
int j=g[a][i];
dfs(j);
for(int ii=1;ii<=k;ii++)
dp[a][ii]+=dp[j][ii-1];
}
}
void dfs_(int a)
{
for(int i=0;i<g[a].size();i++)
{
int j=g[a][i];
for(int ii=k;ii>=2;ii--)
dp[j][ii]+=dp[a][ii-1]-dp[j][ii-2];
dp[j][1]+=dp[a][0];
dfs_(j);
}
}
int main()
{
//freopen("d:\\in.txt","r",stdin);
int T;
scanf("%d",&T);
while(T)
{
int a,b;
for(int i=1;i<=maxn;i++)
g[i].clear();
memset(dp,0,sizeof(dp));
scanf("%d%d%d%d",&n,&k,&a,&b);
for(int i=2;i<=n;i++)
{
int cnt;
cnt=((LL)a*i+b)%(i-1)+1;
g[cnt].push_back(i);
}
dfs(1);
dfs_(1);
long long int ans=0;
for(int i=1;i<=n;i++)
{
long long int temp=0;
for(int ii=0;ii<=k;ii++)
temp+=dp[i][ii];
ans^=temp;
}
printf("%lld\n",ans);
T--;
}
return 0;
}hdu 5593 树形dp
最新推荐文章于 2019-09-22 20:50:10 发布
本文介绍了一种解决HDU5593问题的方法,采用树形动态规划(DP)来求解。代码中定义了一个图结构,并通过两次深度优先搜索(DFS)实现了节点间的依赖关系计算,最终输出所有节点的累加异或结果。
1573

被折叠的 条评论
为什么被折叠?



