Pagini recente » Cod sursa (job #2285318) | Cod sursa (job #963330) | Cod sursa (job #2896684) | Cod sursa (job #227874) | Cod sursa (job #1544726)
#include <fstream>
#include <vector>
#define ll long long
#define MOD 1000000007
using namespace std;
ifstream fin("taxi2.in");
ofstream fout("taxi2.out");
ll s,n,m,numitor[2000000],numarator[2000000];
struct graf{vector<int> vec,cost;} nod[10002];
int calc(int nod)
{
int nrFii = 0, f = 0;
for(int i=0;i<(::nod[nod].vec.size());i++)
{
f = calc(::nod[nod].vec[i]) + 1;
nrFii += f;
s=s+(::nod[nod].cost[i])*2*(n-f)*f;
}
return nrFii;
}
void gcd(ll &x, ll &y, int a, int b)
{
if (!b)
x = 1, y = 0;
else
{
gcd(x, y, b, a % b);
ll aux = x;
x = y;
y = aux - y * (a / b);
}
}
ll comb(int k,int n)
{
if(k==0)
return 1;
ll x, y;
gcd(x,y,numitor[k],MOD);
while(x<0)
x+=MOD;
return numarator[n]*x%MOD;
}
void preCalc(int k,int n,int inc)
{
numitor[0]=1; numarator[inc-1]=1;
for(int i=1;i<=k;i++)
numitor[i] = numitor[i-1]*i % MOD;
for(int i=inc;i<=n;i++)
numarator[i]=numarator[i-1]*i%MOD;
}
void solve()
{
ll rez = 0;
preCalc(m-1,m-1+n*n-1-1,n*n-1);
for(int i=1;i<=m;i++)
rez = (rez + ((comb(m-i,m-i+n*n-1-1) * s) % MOD * i) % MOD) %MOD;
fout<<rez;
}
int main()
{
int m1,m2,c,aux;
fin>>n>>m;
for(int i=1;i<n;i++)
{
fin>>m1>>m2>>c;
if(m1>m2)
aux = m1, m1=m2,m2=aux;
nod[m1].vec.push_back(m2);
nod[m1].cost.push_back(c);
}
calc(1);
solve();
return 0;
}