【每日一题】树

https://ac.nowcoder.com/acm/problem/13611

Solution

其实是道数论题。

题意可以转化为将树分割为不超过 个连通块,每个连通块颜色不同。若将树分割为 个连通块,则需要删去 条边,故方案数为 。同时,要从 种颜色中选出 中颜色染色,而且是有顺序的,故方案数为

综上,总的方案数为:

可以线性求逆元,枚举 实现。

时间复杂度:

Code

#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
const ll mod=1e9+7;
const ll maxn=310;
ll n,k,ans,inv[maxn],f[maxn];
ll C(ll x,ll y){
    return f[x]*inv[y]%mod*inv[x-y]%mod;
}
ll A(ll x,ll y){
    return f[x]*inv[x-y]%mod;
}
int main(){
    ios::sync_with_stdio(false);
    cin>>n>>k;
    inv[0]=f[0]=inv[1]=f[1]=1;
    for(ll i=2;i<maxn;i++)
        inv[i]=((mod-mod/i)*inv[mod%i])%mod,f[i]=i;
    for(ll i=2;i<maxn;i++)
        inv[i]=(inv[i]*inv[i-1])%mod,f[i]=(f[i]*f[i-1])%mod;
    for(ll i=1;i<=k&&i<=n;i++)
        ans=(ans+(C(n-1,i-1)*A(k,i)%mod))%mod;
    cout<<ans;
    return 0;
}
全部评论
大佬,您这里求组合数的方式我都没见过,您这是怎么实现的呐!!! 三个for循环还有A函数、C函数硬是没看懂啊,求大佬教我Orz
点赞 回复 分享
发布于 2021-02-21 19:10

相关推荐

05-09 12:23
已编辑
华南理工大学 Java
野猪不是猪🐗:给他装的,双九+有实习的能看的上这种厂我直接吃⑨✌们拿它练练面试愣是给他整出幻觉了
点赞 评论 收藏
分享
你背过凌晨4点的八股文么:简历挂了的话会是流程终止,像我一样
点赞 评论 收藏
分享
评论
24
1
分享

创作者周榜

更多
牛客网
牛客企业服务