hdu 5593 树形dp

来源:互联网 发布:复方雄蛾强肾胶囊淘宝 编辑:程序博客网 时间:2024/06/05 23:58
//hdu 5593 树形dp#include <cstdio>#include <algorithm>#include <iostream>#include <string.h>#include <vector>#define LL long long#define maxn 500005using 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;}

0 0
原创粉丝点击