专栏文章

P5007 但模数的疑惑

P5007题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mio3hk3w
此快照首次捕获于
2025/12/02 12:45
3 个月前
此快照最后确认于
2025/12/02 12:45
3 个月前
查看原文

省流:answermod108+7answer \bmod 10^8+7

现有题解好像都没有认真讲转移式怎么来的,我来写一下。
显然设 fuf_u 为子树内价值和,wuw_uuu 的点权,由于需要知道集合数才能转移,再设 gug_u 为子树内集合数。
fuf_u 的转移:
  • 已考虑的子树和目前子树内所有集合组合:fu×gvf_u\times g_v
  • 已考虑的子树内所有集合和目前子树组合:gu×fvg_u\times f_v
  • 不取目前子树集合:fuf_u
  • 只取目前子树集合:fvf_v
  • 综上:fufu×gv+gu×fv+fu+fvf_u\to f_u\times g_v+g_u\times f_v+f_u+f_v
gug_u 的转移:
  • 已考虑的子树内所有集合和目前子树集合组合 gu×gvg_u\times g_v
  • 不取目前子树集合:gug_u
  • 只取目前子树集合:gvg_v
  • 综上:gugu×gv+gu+gvg_u\to g_u\times g_v+g_u+g_v
注意到只取 uu 也是一种情况,在最后令 fufu+wu,gugu+1f_u\to f_u+w_u,g_u\to g_u+1 即可。
答案显然为 f1f_1
代码:
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e6+5,mod=1e9+7;
int n,t,u,v;
ll f[N],g[N],w[N];
vector<int> G[N];
void dfs(int u,int fa){
    for(int v:G[u]){
        if(v==fa) continue;
        dfs(v,u);
        f[u]=(f[u]*g[v]+f[v]*g[u]+f[u]+f[v])%mod;
        g[u]=(g[u]*g[v]+g[u]+g[v])%mod;
    }
    (f[u]+=w[u])%mod;
    g[u]++;
}
int main(){
    cin>>n>>t;
    for(int i=1;i<n;i++){
        cin>>u>>v;
        G[u].push_back(v);
        G[v].push_back(u);
    }
    for(int i=1;i<=n;i++)
        w[i]=t*(i-1)+1;
    dfs(1,1);
    cout<<f[1];
    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...