如题
B:求一颗
n
n
n层的满
k
k
k叉树,求任意两点之间距离和等于多少,答案对
1
0
9
+
7
10^9+7
109+7 取模
题目链接:https://ac.nowcoder.com/acm/contest/11186/B
思路:相当于求每一条边的贡献值。怎么求贡献值:有多少种路径经过这条边?那么贡献值就是以这条边为界限,满
k
k
k叉树可以划分为两个部分,两个部分的结点数的乘积,就是这条边的贡献值,我们注意到,同一层的每条边的贡献值都相等,故我们每层只需要计算一次就行,复杂度是O(n)。
#include <bits/stdc++.h>
#include <algorithm>
using namespace std ;
#pragma GCC optimize(2)
#define ull unsigned long long
#define endl '\n'
typedef long long ll ;
const ll maxn = 1e6+100 ;
const ll p = 1e9+7 ;
ll qkp(ll n,ll x){
ll ans = 1 ;
while(n){
if(n&1) ans = ans*x%p ;
x = x*x%p ;
n >>= 1 ;
}
return ans ;
}
void solve(){
int n , k ;
scanf("%d%d",&n,&k) ;
ll ans = 0 , q = k ;
ll inv = qkp(p-2,k-1) ;
ll sum = (qkp(n,k)-1)*inv%p ;
for(int i=1;i<n;++i){
ll t = (qkp(n-i,k)-1)*inv%p ;
t = ((sum-t+p)%p)*t%p ;
ans = (ans+t*q%p)%p ;
q = q*k%p ;
}
cout << ans ;
}
int main(){
ios::sync_with_stdio(0) , cin.tie(0) , cout.tie(0) ;
solve() ;
return 0 ;
}
(PS:没写完)