結果

問題 No.1075 木の上の山
ユーザー nmnmnmnmnmnmnmnmnmnmnmnmnmnm
提出日時 2020-05-16 03:08:37
言語 C++11
(gcc 13.3.0)
結果
AC  
実行時間 168 ms / 2,000 ms
コード長 2,314 bytes
コンパイル時間 992 ms
コンパイル使用メモリ 96,244 KB
実行使用メモリ 27,520 KB
最終ジャッジ日時 2024-09-19 19:04:03
合計ジャッジ時間 4,901 ms
ジャッジサーバーID
(参考情報)
judge1 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 30
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#include <algorithm>
#include <cfloat>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <functional>
#include <iostream>
#include <map>
#include <memory>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
#include <assert.h>
using namespace std;
typedef long long ll;
#define sz size()
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define all(c) (c).begin(), (c).end()
#define rep(i,a,b) for(ll i=(a);i<(b);++i)
#define per(i,a,b) for(ll i=b-1LL;i>=(a);--i)
#define clr(a, b) memset((a), (b) ,sizeof(a))
#define ctos(c) string(1,c)
#define endl "\n"
#define print(x) cout<<#x<<" = "<<x<<endl;
#define MOD 1000000007
ll dp1[1010][1010];
ll dp2[1010][1010];
ll dp3[1010][1010];
long long modpow(long long a, long long b){
long long r = 1LL;
while(b){
if(b & 1LL)r *= a;
if(r >= MOD)r %= MOD;
a *= a;
if(a >= MOD)a %= MOD;
b >>= 1LL;
}
return r%MOD;
}
vector<vector<ll> > vv;
void dfs1(ll a, ll p){
rep(i,1,1005){
ll b = 1;
rep(j,0,vv[a].sz){
if(vv[a][j]==p)continue;
if(i==1)dfs1(vv[a][j],a);
b *= dp1[vv[a][j]][i];
b %= MOD;
}
dp1[a][i] = dp1[a][i-1]+b;
dp1[a][i] %= MOD;
}
}
void dfs2(ll a, ll p){
ll e = 0;
rep(i,1,1005){
if(p==-1){
dp2[a][i] = dp1[a][i];
dp3[a][i] = MOD+dp1[a][i]-dp1[a][i-1];
dp3[a][i] %= MOD;
}
else{
dp3[a][i] = e*(MOD+dp1[a][i]-dp1[a][i-1]);
dp3[a][i] %= MOD;
ll b = (MOD+dp2[p][i]-dp2[p][i-1])%MOD;
b *= modpow(dp1[a][i],MOD-2);
b %= MOD;
b += e;
b %= MOD;
e = b;
dp2[a][i] = b*(MOD+dp1[a][i]-dp1[a][i-1]);
dp2[a][i] += dp2[a][i-1];
dp2[a][i] %= MOD;
}
}
rep(j,0,vv[a].sz){
if(vv[a][j]==p)continue;
dfs2(vv[a][j],a);
}
}
int main(){
ll n,k;
cin>>n>>k;
vector<vector<ll> > vv_(n,vector<ll>());
vv = vv_;
rep(i,0,n-1){
ll a,b;
cin>>a>>b;
a--;b--;
vv[a].pb(b);
vv[b].pb(a);
}
clr(dp1,0);
clr(dp2,0);
clr(dp3,0);
dfs1(0,-1);
dfs2(0,-1);
ll ans = 0;
rep(i,0,n){
rep(j,1,k+1){
ans += dp3[i][j];
ans %= MOD;
}
}
cout << ans << endl;
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0