专栏文章
P5007 但模数的疑惑
P5007题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mio3hk3w
- 此快照首次捕获于
- 2025/12/02 12:45 3 个月前
- 此快照最后确认于
- 2025/12/02 12:45 3 个月前
省流:。
现有题解好像都没有认真讲转移式怎么来的,我来写一下。
显然设 为子树内价值和, 为 的点权,由于需要知道集合数才能转移,再设 为子树内集合数。
的转移:
-
已考虑的子树和目前子树内所有集合组合:
-
已考虑的子树内所有集合和目前子树组合:
-
不取目前子树集合:
-
只取目前子树集合:
-
综上:
的转移:
-
已考虑的子树内所有集合和目前子树集合组合
-
不取目前子树集合:
-
只取目前子树集合:
-
综上:
注意到只取 也是一种情况,在最后令 即可。
答案显然为 。
代码:
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 条评论,欢迎与作者交流。
正在加载评论...