Cod sursa(job #1544726)

Utilizator horiainfoTurcuman Horia horiainfo Data 6 decembrie 2015 13:48:49
Problema Invers modular Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#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;
}