首页 > 其他分享 >CF451E Devu and Flowers

CF451E Devu and Flowers

时间:2022-12-14 21:36:05浏览次数:51  
标签:CF451E a% pow long fast Devu Flowers mod

\(CF451E\) \(Devu\) \(and\) \(Flowers\)

链接:https://www.luogu.com.cn/problem/CF451E

题目描述:将一些球丢进一个盒子里,每一个求有一种颜色,有多少种本质不同的方法

题解:可知该题的模型是多重集的组合数,由于该题不满足\(a_{i}<=r\),则我们需要容斥,每一次容斥有\(s\)个不符合要求的选法,则每一次的贡献为\(\sum_{i=0}^{n}(-1)^n\sum_{|S|==i}{}C(s,sum-(sum_a(S)+|S|))\)

#include<iostream>
#include<cstdio>
#define mod 1000000007
using namespace std;
long long ans,n,k,f[22],res,mul=1;
long long fast_pow(long long a,int b)
{
  if (b==0)
    return 1;
  if (b&1)
    return fast_pow(a*a%mod,b/2)*a%mod;
  else
    return fast_pow(a*a%mod,b/2);
}
long long C(long long b)
{
  res=mul;
  for (long long i=b-(n-1)+1;i<=b;++i)
    res=(res*(i%mod))%mod;
  return res;
}
void dfs(int x,int r,long long sum)
{
  if (sum<n-1)
    return;
  if (x==n+1)
    {
      if (r%2==1)
	ans=(ans+C(sum))%mod;
      else
	ans=(ans-C(sum))%mod;
      return;
    }
  for (int i=x+1;i<=n+1;++i)
      dfs(i,r+1,sum-f[i]-1);
  return;
}
int main()
{
  scanf("%lld%lld",&n,&k);
  for (int i=1;i<=n;++i)
    scanf("%lld",&f[i]);
  for (long long i=1;i<=n-1;++i)
    mul=(mul*fast_pow(i%mod,mod-2))%mod;
  dfs(0,0,n+k);
  printf("%lld\n",(ans+mod)%mod);
  return 0;
}

标签:CF451E,a%,pow,long,fast,Devu,Flowers,mod
From: https://www.cnblogs.com/zhouhuanyi/p/16983589.html

相关文章