Submission #12794351
Source Code Expand
#define _CRT_SECURE_NO_WARNINGS
#define _USE_MATH_DEFINES
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <functional>
#include <utility>
#include <tuple>
#include <cctype>
#include <bitset>
#include <complex>
#include <cmath>
#include <array>
#include <numeric>
using namespace std;
#define INF 0x3f3f3f3f
#define INFLL 0x3f3f3f3f3f3f3f3fLL
//#define MOD 998244353
#define MOD 1000000007
#define mp make_pair
#define mt make_tuple
#define pb push_back
#define eb emplace_back
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pint;
typedef pair<ll,ll> pll;
typedef tuple<int,int,int> tint;
typedef vector<int> vint;
typedef vector<ll> vll;
typedef vector<ull> vull;
typedef vector<pint> vpint;
typedef vector<tint> vtint;
typedef vector<vint> vvint;
int dx[8]={0,0,-1,1,1,1,-1,-1};
int dy[8]={-1,1,0,0,1,-1,1,-1};
const int SIZE=200050;
//↑templete
ll mod_pow(ll x, ll n, ll mod) {
if(n == 0) return 1;
ll res = mod_pow((x * x) % mod, n / 2 , mod);
if(n & 1) res = (res * x) % mod;
return res;
}
ll ex[SIZE]={1,0};
ll inv[SIZE]={1,0};
ll comb(ll n, ll r){
return (ex[n]*inv[n-r]%MOD*inv[r])%MOD;
}
vint node[SIZE];
unordered_map<int, bool> done[SIZE];
unordered_map<int, pll> DP[SIZE]; //DP[a][b] = (a->bの部分木に対する番号の振り方, 部分木のサイズ)
void DFS_1(int now, int prev){ //頂点0から向かう方向のDPテーブルを求める
ll val=1, siz=1;
for(int next:node[now]){
if(next == prev)
continue;
DFS_1(next, now);
(val*=inv[DP[now][next].second])%=MOD;
(val*=DP[now][next].first)%=MOD;
siz+=DP[now][next].second;
}
if(prev == -1)
return;
DP[prev][now].first=(val*ex[siz-1])%MOD;
DP[prev][now].second=siz;
done[prev][now]=1;
}
void DFS_2(int now, int prev){ //nowに入ってくる辺について、DPテーブルを求める
//入ってくる辺についてDPテーブルを求めるためには、出ていく辺についてすべて求められていなくては駄目
ll val_prod=1, siz_sum=1;
for(int next:node[now]){
(val_prod*=inv[DP[now][next].second])%=MOD;
(val_prod*=DP[now][next].first)%=MOD;
siz_sum+=DP[now][next].second;
}
for(int next:node[now]){
if(done[next][now])
continue;
(val_prod*=ex[DP[now][next].second])%=MOD;
(val_prod*=mod_pow(DP[now][next].first, MOD-2, MOD))%=MOD;
siz_sum-=DP[now][next].second;
DP[next][now].first=(val_prod*ex[siz_sum-1])%MOD;
DP[next][now].second=siz_sum;
done[next][now]=1;
(val_prod*=inv[DP[now][next].second])%=MOD;
(val_prod*=DP[now][next].first)%=MOD;
siz_sum+=DP[now][next].second;
}
for(int next:node[now]){
if(next == prev)
continue;
DFS_2(next, now);
}
}
signed main(){
for(int i=1;i<SIZE;i++){
ex[i]=ex[i-1]*i%MOD;
}
for(int i=1;i<SIZE;i++){
inv[i]=mod_pow(i,MOD-2,MOD);
}
for(int i=1;i<SIZE;i++){
inv[i]=inv[i-1]*inv[i]%MOD;
}
int N;
cin>>N;
for(int i=0;i<N-1;i++){
int a, b;
cin>>a>>b;
a--, b--;
node[a].pb(b);
node[b].pb(a);
}
DFS_1(0, -1);
DFS_2(0, -1);
// for(int i=0;i<N;i++){
// for(int j=0;j<N;j++)
// cout<<i<<" "<<j<<" "<<DP[i][j].first<<" "<<DP[i][j].second<<endl;
// }
ll ans=0;
for(int now=0;now<N;now++){
ll val=1, siz=1;
for(int next:node[now]){
(val*=inv[DP[now][next].second])%=MOD;
(val*=DP[now][next].first)%=MOD;
siz+=DP[now][next].second;
}
(val*=ex[siz-1])%=MOD;
(ans+=val)%=MOD;
cout<<val<<endl;
}
//cout<<ans<<endl;
return 0;
}
Submission Info
| Submission Time |
|
| Task |
F - Distributing Integers |
| User |
takeo1116 |
| Language |
C++14 (GCC 5.4.1) |
| Score |
600 |
| Code Size |
4269 Byte |
| Status |
AC |
| Exec Time |
1213 ms |
| Memory |
86716 KiB |
Judge Result
| Set Name |
Sample |
All |
| Score / Max Score |
0 / 0 |
600 / 600 |
| Status |
|
|
| Set Name |
Test Cases |
| Sample |
sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt |
| All |
line_01.txt, line_02_shuffled.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06_shuffled.txt, random_07_shuffled.txt, random_08_shuffled.txt, random_09_shuffled.txt, random_10.txt, sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt, star_01.txt, star_02_shuffled.txt |
| Case Name |
Status |
Exec Time |
Memory |
| line_01.txt |
AC |
327 ms |
50816 KiB |
| line_02_shuffled.txt |
AC |
375 ms |
48896 KiB |
| random_01.txt |
AC |
1203 ms |
86400 KiB |
| random_02.txt |
AC |
1192 ms |
86400 KiB |
| random_03.txt |
AC |
1193 ms |
86272 KiB |
| random_04.txt |
AC |
1195 ms |
86272 KiB |
| random_05.txt |
AC |
1202 ms |
86400 KiB |
| random_06_shuffled.txt |
AC |
1195 ms |
86272 KiB |
| random_07_shuffled.txt |
AC |
1201 ms |
86400 KiB |
| random_08_shuffled.txt |
AC |
1202 ms |
86272 KiB |
| random_09_shuffled.txt |
AC |
1207 ms |
86272 KiB |
| random_10.txt |
AC |
1213 ms |
86272 KiB |
| sample_01.txt |
AC |
132 ms |
29952 KiB |
| sample_02.txt |
AC |
132 ms |
29952 KiB |
| sample_03.txt |
AC |
132 ms |
29952 KiB |
| sample_04.txt |
AC |
132 ms |
29952 KiB |
| star_01.txt |
AC |
829 ms |
86716 KiB |
| star_02_shuffled.txt |
AC |
1113 ms |
86716 KiB |