ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF917D Stranger Trees

2020-01-28 22:58:07  阅读:235  来源: 互联网

标签:ch return Stranger int namespace 1ll Trees CF917D long


Link
众所周知Kirchhoff定理中的边权可以是多项式。
直接NTT的复杂度是\(O(n^4\log n)\)。
带\(n\)个值进去算然后快速插值Lagrange插值或者Gauss消元是\(O(n^4)\)的。

#include<bits/stdc++.h>
#define LL long long
using namespace std;
namespace IO
{
    char ibuf[(1<<21)+1],obuf[(1<<21)+1],st[15],*iS,*iT,*oS=obuf,*oT=obuf+(1<<21);
    char Get() { return (iS==iT? (iT=(iS=ibuf)+fread(ibuf,1,(1<<21)+1,stdin),(iS==iT? EOF:*iS++)):*iS++); }
    void Flush() { fwrite(obuf,1,oS-obuf,stdout),oS=obuf; }
    void Put(char x) { *oS++=x; if(oS==oT) Flush(); }
    int read() { int x=0; char ch=Get(); while(ch>'9'||ch<'0') ch=Get(); while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch^48),ch=Get(); return x; }
    void write(int x) { int top=0; if(!x) Put('0'); while(x) st[++top]=(x%10)+48,x/=10; while(top) Put(st[top--]); Put(' '); }
}
using namespace IO;
const int N=103,P=1000000007;
int a[N][N],c[N][N],b[N];
int power(int a,int k=P-2){int r=1;for(;k;k>>=1,a=1ll*a*a%P)if(k&1)r=1ll*a*r%P;return r;}
void swap(int &x,int &y){x^=y^=x^=y;}
int inc(int a,int b){a+=b;return a>=P? a-P:a;}
int dec(int a,int b){a-=b;return a<0? a+P:a;}
int det(int n)
{
    int ans=1;
    for(int i=1,j,k,Inv,num;i<=n;++i)
    {
        Inv=power(c[i][i]);
        for(j=i+1;j<=n;++j)
        {
            num=1ll*c[j][i]*Inv%P;
            for(k=i;k<=n;++k) c[j][k]=dec(c[j][k],1ll*num*c[i][k]%P);
        }
        ans=1ll*ans*c[i][i]%P;
        if (!c[i][i]) break;
    }
    return ans;
}
int main()
{
    int n=read();
    for(int i=1,x,y;i<n;++i) x=read(),y=read(),a[x][y]=a[y][x]=1;
    for(int k=1,i,j;k<=n;++k)
    {
        memset(c,0,sizeof c);
        for(i=1;i<=n;++i) for(j=1;j<=n;++j) if(i^j) if(a[i][j]) c[i][j]=P-k,c[i][i]+=k; else c[i][j]=P-1,c[i][i]+=1;    
        b[k]=det(n-1);
    }
    for(int i=1,j;i<=n;++i)
    {
        c[i][1]=1;
        for (j=2;j<=n;++j) c[i][j]=1ll*c[i][j-1]*i%P;
    }
    for(int i=1,j,k,Inv,num;i<=n;++i)
    {
        Inv=power(c[i][i]);
        for(j=1;j<=n;++j)
            if(i^j)
        {
        num=1ll*c[j][i]*Inv%P;
        for(k=i;k<=n;++k) c[j][k]=dec(c[j][k],1ll*num*c[i][k]%P);
        b[j]=dec(b[j],1ll*num*b[i]%P);
        }
    }
    for(int i=1;i<=n;++i) write(1ll*b[i]*power(c[i][i])%P);
    return Flush(),0;
}

标签:ch,return,Stranger,int,namespace,1ll,Trees,CF917D,long
来源: https://www.cnblogs.com/cjoierShiina-Mashiro/p/12239188.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有