列表

详情


NC13229. 二分图染色

描述

给定一个完全二分图,图的左右两边的顶点数目相同。我们要给图中的每条边染成红色、蓝色、或者绿色,并使得任意两条红边不共享端点、同时任意两条蓝边也不共享端点。
计算所有满足条件的染色的方案数,并对10^9+7取模。
(ps:本题数据量与实际比赛中数据量相比,少了一些)

输入描述

二分图单边的顶点数目n(n ≤ 10^7)

输出描述

输出一个整数,即所求的答案。

示例1

输入:

2

输出:

35

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 53ms, 内存消耗: 11716K, 提交时间: 2018-06-09 18:03:55

#include <bits/stdc++.h>
using namespace std;
const int N=1e7+1,MD=1e9+7;
int n,fac[N],inv[N],F[N],ans;
int po(int x,int y)
{
    int t=1;
    for(; y; y>>=1,x=1LL*x*x%MD)
        if(y&1)t=1LL*t*x%MD;
    return t;
}
int main()
{
    scanf("%d",&n);
    fac[0]=1,fac[1]=1,F[0]=1,F[1]=2;
    for(int i=2; i<=n; i++)
    {
        fac[i]=1LL*fac[i-1]*i%MD;
        F[i]=(1LL*F[i-1]*(i+i)-1LL*(i-1)*(i-1)%MD*F[i-2])%MD;
    }
    inv[n]=po(fac[n],MD-2);
    for (int i=n; i; i--)
        inv[i-1]=1LL*inv[i]*i%MD;
    for(int i=0; i<=n; i++)
        ans=(ans+1LL*(i&1?-1:1)*fac[n]*fac[n]%MD*inv[i]%MD*inv[n-i]%MD*inv[n-i]%MD*F[n-i]%MD*F[n-i])%MD;
    printf("%d\n",(ans+MD)%MD);
    return 0;
}

上一题