CF gym 101933 K King's Colors —— 二项式反演

题目:http://codeforces.com/gym/101933/problem/K

其实每个点的颜色只要和父亲不一样即可;

所以至多 i 种颜色就是 \( i * (i-1)^{n-1} \),设为 \( f(i) \),设恰好 i 种颜色为 \( g(i) \)

那么 \( f(i) = \sum\limits_{j=0}^{i} C_{i}^{j} * g(j) \)

二项式反演得到 \( g(i) = \sum\limits_{j=0}^{k} (-1)^{k-j} * C_{k}^{j} * f(j) \)

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int rd()
{
  int ret=0,f=1; char ch=getchar();
  while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=0; ch=getchar();}
  while(ch>=‘0‘&&ch<=‘9‘)ret=ret*10+ch-‘0‘,ch=getchar();
  return f?ret:-ret;
}
int const xn=2505,mod=1e9+7;
int n,k,f[xn],c[xn][xn];
int upt(int x){while(x>=mod)x-=mod; while(x<0)x+=mod; return x;}
ll pw(ll a,int b){ll ret=1; for(;b;b>>=1,a=a*a%mod)if(b&1)ret=ret*a%mod; return ret;}
void init()
{
  for(int i=0;i<=k;i++)c[i][0]=1;
  for(int i=1;i<=k;i++)
    for(int j=1;j<=i;j++)
      c[i][j]=upt(c[i-1][j]+c[i-1][j-1]);
}
int main()
{
  n=rd(); k=rd(); init();
  for(int i=1;i<n;i++)rd();
  for(int i=1;i<=k;i++)f[i]=(ll)i*pw(i-1,n-1)%mod;
  int ans=0;
  for(int i=0;i<=k;i++)ans=upt(ans+(ll)f[i]*c[k][i]%mod*(((k-i)&1)?-1:1));
  printf("%d\n",ans);
  return 0;
}

CF gym 101933 K King's Colors —— 二项式反演

原文地址:https://www.cnblogs.com/Zinn/p/10273563.html

时间: 2024-08-09 03:23:54

CF gym 101933 K King's Colors —— 二项式反演的相关文章

Gym .101933 Nordic Collegiate Programming Contest (NCPC 2018) (寒假gym自训第四场)

(本套题算是比较温和吧,就是罚时有点高. B .Baby Bites 题意:给出一个婴儿给出的数组,有一些数字听不清楚,让你还原,问它是否是一个从1开始的一次增加的数组. 思路:从左往右依次固定,看是否有矛盾即可. #include<bits/stdc++.h> #define ll long long #define rep(i,a,b) for(int i=a;i<=b;i++) #define rep2(i,a,b) for(int i=a;i>=b;i--) using n

Gym 101933

B. Baby Bites水题直接模拟即可 1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 #include <cmath> 5 #include <algorithm> 6 #include <set> 7 #include <iostream> 8 #include <map> 9 #include <stack> 10

【题解】CF917D Stranger Trees(prufer序列+二项式反演)

[题解]CF917D Stranger Trees(prufer序列+二项式反演) 考虑有一个东西叫做\(prufer\)序列,然后个东西叫做图联通方案数. 然后我们考虑先算一下至少\(k\)条边在方案里的方案数,我们可以用树形dp \(dp(i,j,k)\)表示对于\(i\)节点及其子树,共有\(j\)条边被选中,且和\(i\)共有\(k\)个点是在一个联通块里的\(\prod siz[]\)之和.转移很简单啦.(但是CF的内存访问极慢!要用对内存友好的写法) 通过\(dp()\)可以很方便的

Gym 101933 King&#39;s Colors

Link 设用\(k\)种颜色给\(n\)个点的树染色(必须全用)的方案数为\(f(k)\),用\(k\)种颜色给\(n\)个点的树染色(可以缺用)的方案数为\(g(k)\). 显然有\(g(k)=k(k-1)^{n-1}=\sum\limits_{i=2}^k{k\choose i}f(i)\),直接二项式反演即可. #include<cstdio> using i64=long long; const int N=2507,P=1000000007; int read(){int x;sc

二项式反演

问:给你k种颜色,你必须用上所有颜色去涂满n个相邻的格子,并且要求相邻格子的颜色不同,求方案数. 我们设必须用 i 种颜色两两不相邻的涂格子的方案数为 b(i) ; 很明显: ,我们令 a(k)=k·(k-1)n-1 , 然后有. 如果你知道二项式反演的话,那么这个问题就已经解决了,因为. 是不是觉得二项式反演很厉害,下面我将给出它的证明. 二项式反演公式: 证明: 然后让我们对进行分析: 我们预热一下: 有A,B,C,D,E,F,G 7个人,我们要先从中选出4个候选人,再从中选出3个作为mas

2014ACM/ICPC亚洲区西安站现场赛 F color(二项式反演)

题意:小球排成一排,从m种颜色中选取k种颜色给n个球上色,要求相邻的球的颜色不同,求可行的方案数,答案模1e9+7.T组数据,1<= n, m <= 1e9, 1 <= k <= 1e6, k <= n, m 分析: a(k)表示用不超过k种颜色染n个位置,两两相邻颜色不相同的总数,很简单a(k)=k(n-1)^(k-1) b(k)表示恰好用k种颜色 很显然a(k)=ΣC(k,i)b(i),我们知道a,想知道b,这里就用到二项式反演 那么b(k)=ΣC(k,i)*i*(-1)

二项式反演学习笔记

这是一篇防遗忘的二项式反演证明博客 在此不给出精妙的容斥证明,开始推代数证明 众所周知二项式反演有两个形式 \(f(n) = \sum_{i = 0}^{n} (-1)^{i}\binom{n}{i}g(i) \Leftrightarrow g(n) = \sum_{i = 0}^{n} (-1)^{i} \binom{n}{i}f(i)\) 这个式子简直妙啊--太对称了 然而它更常用的形式是这个 \(f(n) = \sum_{i = 0}^{n}\binom{n}{i}g(i) \Leftri

Luogu4859 二项式反演

今天学了一个叫二项式反演的有趣东西. 其实它的核心式子就两个 若\(g_i=\sum_{j=i}^n\binom{j}{i}f[j]\) 那么\(f_i=\sum_{j=i}^n(-1)^{j-i}\binom{j}{i}g[j]\) 证明是用容斥证的. 现在我们看这道题. 题目链接 我们知道答案就是\(a>b\)的对数为\(\frac{n+k}{2}\)的方案数. 令\(x=\frac{n+k}{2}\) 考虑普通\(dp\). 用\(f[i][j]\)表示前\(i\)个数,已经有\(j\)对

[bzoj3622]已经没有什么好害怕的了——容斥or二项式反演+DP

题目大意: 给定两个长度为\(n\)的序列,求有多少种匹配方式,使得\(a_i<b_i\)的个数恰好为\(k\)个. 思路: 据说是一道二项式反演的经典例题了. 首先如果要求正好等于\(k\)个的是不太好求的,我们可以考虑求出至少为\(k\)个的方案数. 首先先把两个序列都按照从小到大的顺序排好序,然后以序列\(b\)为对象dp. 我们设\(f_{i,j}\)表示前\(i\)个数里面强制确定了\(j\)个\(a_i<b_i\)关系的方案数,记\(c_i\)表示在\(a\)中有多少个数<\