萌新求助简单换根dp题的部分分。
查看原帖
萌新求助简单换根dp题的部分分。
455490
Sharpsmile楼主2024/4/4 11:19

rt,还没写第二问,第一问只有 2/10。不知道哪里错了。

#include <bits/stdc++.h>
using namespace std;
#define int long long 
const int M=1e9+7;
inline int qp(int a,int x){
	int res=1;
	while(x){
		if(x&1)res=res*a%M;
		a=a*a%M;
		x>>=1;
	}
	return res;
} 
inline int inv(int x){
	return qp(x,M-2);
}
int l[210],r[210],p[210],f[210];
vector<int>T;
int n,k;
vector<int>g[210];
inline void mk(int L,int R){
	for(int i=1;i<=n;i++)
	p[i]=max(0ll,min(r[i],R)-max(l[i],L)+1);
}
inline void add(int &x,int y){
	x+=y;
	if(x>=M)x-=M;
}
inline void dfs1(int u,int fa){
	f[u]=1;
	for(int v:g[u])
	if(v!=fa)dfs1(v,u),add(f[u],f[v]);
	f[u]=f[u]*p[u]%M;
}
inline void dfs2(int u,int fa){
	if(fa)add(f[u],(f[fa]-f[u]*p[fa]%M+M)*p[u]%M);
	for(int v:g[u])
	if(v!=fa)dfs2(v,u);
}
int ANS;
const int I2=inv(2);
inline int calc1(int L,int R){
	mk(L,R);
	dfs1(1,0);
	dfs2(1,0);
	int res=0;
	for(int i=1;i<=n;i++)add(res,(f[i]+p[i])*I2%M);
	return res;
}
inline int LAG(int n,int *x,int *y,int X){
	int res=0;
	for(int i=0;i<=n;i++){
		int cntfz=1,cntfm=1;;
		for(int j=0;j<=n;j++)
			if(i!=j)
			cntfz=cntfz*(X-x[j]+M)%M,
			cntfm=cntfm*(x[i]-x[j]+M)%M;
		add(res,y[i]*cntfz%M*inv(cntfm)%M);
	}
	return res;
}
int x[210],y[210];
inline int CALC1(int L,int R){
	int p=n+5;
	int pre=0;
	for(int i=L;i<=L+p;i++)
		x[i-L]=i,y[i-L]=(pre+=calc1(i,i+k))%M;
	return LAG(p,x,y,R);
} 
inline void ins(int x){
	if(x<=0)return ;
	T.push_back(x); 
}
signed main(){
//	freopen("tree.in","r",stdin);
//	freopen("tree.out","w",stdout);
	ios::sync_with_stdio(0);
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>l[i]>>r[i];
		ins(l[i]);
		ins(r[i]);
	}
	T.push_back(1e9);
	T.push_back(1e9+1);
	for(int i=1;i<n;i++){
		int u,v;
		cin>>u>>v;
		g[u].push_back(v);
		g[v].push_back(u); 
	}
	sort(T.begin(),T.end());
	T.resize(unique(T.begin(),T.end())-T.begin());
	int res1=0;
	int lst=0;
	for(int x:T){
		if(x==1e9+1)continue;
		add(res1,CALC1(lst+1,x));
		lst=x;
		
	}
	lst=1;
	k--;
	for(int x:T){
		if(x<=lst)continue;
		add(res1,M-CALC1(lst+1,x));
		lst=x;
	}
	cout<<res1<<endl;
	cout<<0<<endl;
	return 0;
} 
2024/4/4 11:19
加载中...