题意:
有k种颜色,每种颜色对应a[i]个球,球的总数不超过1000
要求第i种颜色的最后一个球,其后面接着的必须是第i+1种颜色的球
问一共有多少种排法
Sample test(s)
input

output

input

output

Note

In the first sample, we have 2 balls of color 1, 2 balls of color 2, and 1 ball of color 3. The three ways for Kyoya are:


思路:
首先我们容易想到我们必须要确定每种颜色最后一个球的放法
所有对于最后一种颜色,假设这种颜色有b个球,而总球数为a
那么必然有一个球是放在最后一个位置的,那么剩下的球就是z=C(b-1,a-1)种方法
那么对于倒数第二种球,假设有x个,此时总球数位y=a-b
那么之前已经有z种方法了,而对于每一种放法,此时倒数第二种颜色拿出一个作为最后一个球的话,它对于每种放法必然只有一个固定方法,位置是最后一个没有放球的位置,这样既保证放法符合要求,而剩下的球就有C(x-1,y-1)种放法
然后相乘得到最后一种颜色与最后第二种颜色的方法,以此类推。。
可以使用费马小定理来优化组合数计算

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<cmath>
using namespace std;
#define MOD 1000000007
#define ll long long
ll n;
ll a[];
ll fac[];
ll pow_mod(ll a,ll i)
{
if(i==)
return %MOD;
ll t=pow_mod(a,i/);
ll ans=t*t%MOD;
if(i%==)
ans=ans*a%MOD;
return ans;
}
ll work(ll m,ll i)
{
return ( (fac[m]%MOD)* ( pow_mod(fac[i]*fac[m-i]%MOD ,MOD-)%MOD))%MOD;
} int main()
{
fac[]=;
for(int i=;i<;i++)
fac[i]=(fac[i-]*i)%MOD;
ll ans=;
ll sum=;
scanf("%I64d",&n);
for(int i=;i<=n;i++)
{
scanf("%I64d",&a[i]);
sum+=a[i];
}
for(int i=n;i>=;i--)
{
ans=ans*work(sum-,a[i]-)%MOD;
sum-=a[i];
}
printf("%I64d\n",ans);
return ;
}
 

最新文章

  1. Selenium 元素定位
  2. CentOS_7 OpenWrt Eclipse 环境搭建与 Dr.com 开发笔记
  3. ManualResetEvent和AutoResetEvent的区别实例
  4. eclipse 改变字体大小
  5. Golang做的验证码(2)
  6. C# ASP .NET WEB方向和WPF方向,我该如何去选择
  7. Tick and Tick
  8. jquery阻止事件的两种实现方式
  9. 我的java学习笔记
  10. Redis锁构造
  11. 单链表创建、删除、查找、插入之C语言实现
  12. Topcoder口胡记 SRM 562 Div 1 ~ SRM 599 Div 1
  13. php去除数组中重复值,并返回结果!
  14. 马凯军201771010116《面向对象与程序设计Java》第十七周学习总结
  15. TZOJ 2519 Regetni(N个点求三角形面积为整数总数)
  16. windows2012系统IE浏览器无法打开加载flashplayer内容
  17. SQL Server 2014 新特性——内存数据库(转载)
  18. 通过.json()将服务器返回的字符串转换成字典
  19. 怎样为你的CSDN博客增加百度统计
  20. sqlplus下 查看oracle 执行计划

热门文章

  1. HDU4662+无
  2. UDP C/S编程
  3. shell脚本加密
  4. Android文字的复制和粘贴
  5. C#位移运算符
  6. [转] iOS性能优化技巧
  7. 关闭窗口(window.close)
  8. angular 指令 要点解析
  9. MySql中PreparedStatement对象与Statement对象
  10. uva 759 - The Return of the Roman Empire