【XSY1538】连在一起的幻想乡 数学 无向连通图计数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ez_yww/article/details/77198516

题目大意

​  给你n,p,求n个点组成的所有无向连通图的边数的平方和模p

​  n2000,p109

题解

​  设m=n(n1)2,h0n=n个点无向图的个数,h1n=n个点组成的所有无向图的边数之和,h2n=n个点组成的所有无向图的边数的平方和,f0n=n个点无向连通图的个数,f1n=n个点组成的所有无向连通图的边数之和,f2n=n个点组成的所有无向连通图的边数的平方和

  每条边可以选或不选,所以

h0n=2m

  因为每条边会被选中2m1次,所以

h1n=m2m1

  因为选i条边有(mi)种方法,所以

h2n=i=0mi2(m i)

  但是这个式子没法快速算出来。我们换一种思路。

​  我们枚举点1连出去的边的条数i,根据(x+y)2=x21+2xy+y2,可得

h2n=i=0n1(n1i)(h2n1+2ih1n1+i2h0n1)

​  我们枚举与点1在同一个联通分量里的点的个数,计算联通分量数2的答案,然后用总的答案去减

f0n=h0ni=1n1(n1i1)f0ih0ni

f1n=h1ni=1n1(n1i1)(f0ih1ni+f1ih0ni)

f2n=h2ni=1n1(n1i1)(f0ih2ni+2f1ih1ni+f2ih0ni)

​  时间复杂度:O(n2)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
ll p;
ll fp(ll a,ll b)
{
    ll s=1;
    while(b)
    {
        if(b&1)
            s=s*a%p;
        a=a*a%p;
        b>>=1;
    }
    return s;
}
ll c[2010][2010];
ll f0[2010],f1[2010],f2[2010];
ll h0[2010],h1[2010],h2[2010];
int main()
{
//  freopen("road.in","r",stdin);
    int n;
    scanf("%d%lld",&n,&p);
    int i,j;
    c[0][0]=1;
    for(i=1;i<=n;i++)
    {
        c[i][0]=1;
        for(j=1;j<=i;j++)
            c[i][j]=(c[i-1][j]+c[i-1][j-1])%p;
    }
    h0[1]=1;
    h1[1]=h2[1]=0;
    for(i=2;i<=n;i++)
    {
        int m=i*(i-1)/2;
        h0[i]=fp(2,m);
        h1[i]=m*fp(2,m-1)%p;
        h2[i]=0;
        for(j=0;j<=i-1;j++)
            h2[i]=(h2[i]+c[i-1][j]*((h2[i-1]+2*j%p*h1[i-1]%p+j*j%p*h0[i-1]%p)%p)%p)%p;
    }
    f0[0]=f0[1]=1;
    for(i=2;i<=n;i++)
    {
        f0[i]=h0[i];
        f1[i]=h1[i];
        f2[i]=h2[i];
        for(j=1;j<=i-1;j++)
        {
            f0[i]=(f0[i]-c[i-1][j-1]*f0[j]%p*h0[i-j]%p)%p;
            f1[i]=(f1[i]-c[i-1][j-1]*((f0[j]*h1[i-j]%p+f1[j]*h0[i-j]%p)%p)%p)%p;
            f2[i]=(f2[i]-c[i-1][j-1]*((f0[j]*h2[i-j]%p+2*f1[j]*h1[i-j]%p+f2[j]*h0[i-j]%p)%p)%p)%p;
        }
    }
    ll ans=(f2[n]%p+p)%p;
    printf("%lld\n",ans);
    return 0;
}

没有更多推荐了,返回首页