A SRM 05 - YYL 杯 R1

背景

傻逼题

描述

给一个序列,序列里只有两种元素1和2。现在要从序列里选出一些非空子序列使得子序列里两种元素数量相同。问有多少种方案数?

输入格式

多组数据

第一行一个正整数T,表示数据组数。

每组数据内

第一行 两个个正整数n,表示序列的长度

第二行 n个数字,表示整个序列。

输出格式

一个整数,表示方案数(mod 1e9+7)。

样例输入

1

3

2 2 1

样例输出

2

数据范围与约定

样例解释
在第一个样例中,两个子序列分别为{1,3},{2,3},集合中数字为元素下标。

这道题呢 很容易发现答案和数字的排列顺序无关 我们只需要统计1和2的个数 然后一波组合数就可以推出答案了对吧 23333

但是啊 这题n可以到1e6(但是实测没有....)所以我们不可能用o(n2)的递推预处理组合数 而且空间也不够

这时候我们可以想到预处理阶乘 时间空间都满足而且可以实现o(1)计算组合数的值

但是组合数C(n,m)=n!/m!(n-m)! 而除法是不满足除法过程中取模的

这个时候逆元的派上了用场  a/b==a*power(b,P-2)%P

所以乘法是满足取余性质的 我们就可以o(n)预处理出阶乘取模后的值了

又由费马小定理的 因为p为质数 所以我们可以推出b的逆元

只用一次快速幂就能算出1e6的逆元 然后利用公式

fac(i)=fac(i-1)*i
fac_inv(i-1)=fac_inv(i)*i

tips fac为阶乘fac_inv为阶乘逆元

就可以o(n)预处理逆元了

然后就枚举一波 i—min(cnt1,cnt2) 就可以算出答案了 23333

不过注意每乘一次就要取余一次 不然可能会炸longlong

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int mod=1e9+7,M=1000001;
LL read(){LL ans=0,f=1,c=getchar();while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();}while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();}return ans*f;
}
LL T,n,cnt1,cnt2,k,ans;
LL w[M],b[M];
LL qmod(LL a,LL b,LL c){LL ans=1;while(b){if(b&1) ans=ans*a%c;b=b/2;a=a*a%c;}return ans;
}
void prepare(){int mx=1000000; w[1]=1;for(int i=2;i<=mx;i++) w[i]=w[i-1]*i%mod;b[mx]=qmod(w[mx],mod-2,mod); //printf("[%lld]\n",w[mx]);for(int i=mx;i>=1;i--) b[i-1]=b[i]*i%mod; //printf("[%d]\n",b[0]);
}
int main()
{prepare();T=read();while(T--){n=read(); cnt1=0; cnt2=0; ans=0;for(int i=1;i<=n;i++){k=read();if(k==1) cnt1++;else cnt2++;}for(int i=1;i<=min(cnt1,cnt2);i++)ans=(ans+w[cnt1]*b[i]%mod*b[cnt1-i]%mod*w[cnt2]%mod*b[i]%mod*b[cnt2-i]%mod)%mod;printf("%lld\n",ans);}return 0;
}

View Code

转载于:https://www.cnblogs.com/lyzuikeai/p/7169435.html

汕头市队赛 yyl杯1 T1相关推荐

  1. 汕头市队赛 yyl杯1 T2

    B SRM 05 - YYL 杯 R1 背景&&描述 有一个拥有n个城市的国家.这个国家由n-1条边连接起来.有一天国家发生叛乱.叛军已占领了一些城市.如果叛军占领的城市中,存在两个城 ...

  2. 汕头市队赛 C SRM 05 - YYL 杯 R1 T3!

    C SRM 05 - YYL 杯 R1 背景 tjmak 描述 给一个大小为n的序列V.序列里的元素有正有负.问至少要删除多少个元素使得序列里不存在区间(要求非空)和 >= S.如果答案大于m, ...

  3. 广东汕头市队赛? T1 模拟

    骰子 (dice.pas/c/cpp) 1s 128MB 骰子.骰子就是很普通的骰子:骰子有六个面,分别标号1到6,三对面上的数字之和均为7. 游戏的地图:一个高为R宽为C的网格图. 骰子一开始的状态 ...

  4. 汕头市队赛 SRM16 T2

    描述 猫和老鼠,看过吧?猫来了,老鼠要躲进洞里.在一条数轴上,一共有n个洞,位置分别在xi,能容纳vi只老鼠.一共有m只老鼠位置分别在Xi,要躲进洞里,问所有老鼠跑进洞里的距离总和最小是多少. 输入格 ...

  5. 2018年国赛高教杯数学建模A题高温作业专用服装设计解题全过程文档及程序

    2018年国赛高教杯数学建模 A题 高温作业专用服装设计 原题再现   在高温环境下工作时,人们需要穿着专用服装以避免灼伤.专用服装通常由三层织物材料构成,记为I.II.III层,其中I层与外界环境接 ...

  6. java. 三个人比赛怎么写_两个乒乓球队进行比赛,找出三队赛手的名单

    [java]代码库import java.util.ArrayList; /** * 两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人.已抽签决定比赛名单.有人向队员打听比赛 ...

  7. 乒乓球比赛 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比 请编程序找出三队赛手的名单。

    //:两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人.   //已抽签决定比赛名单.有人向队员打听比赛的名单.a说他不和x比,c说他不和x,z比 //,请编程序找出三队赛手 ...

  8. 国赛高教杯使用python/matlab必会基础数学建模-数据处理模块(课程4)

    前言:我看有人的博客学习资料本就是基础知识然后还整个付费专栏博客,那我就直接打破这一垄断,直接上干货免费资料供大家学习. 国赛高教杯数据处理全过程总结 数据存在的问题   ⚫ 数据预处理是数据挖掘中的 ...

  9. 2019年国赛高教杯数学建模E题薄利多销分析解题全过程文档及程序

    2019年国赛高教杯数学建模 E题 薄利多销分析 原题再现   "薄利多销"是通过降低单位商品的利润来增加销售数量,从而使商家获得更多盈利的一种扩大销售的策略.对于需求富有弹性的商 ...

最新文章

  1. 扩增子图表解读6韦恩图:比较组间共有和特有OTU或分类单元
  2. Go Web开发之Revel - 组织结构
  3. Ubuntu 14.04 LTS 配置 Juno 版 Keystone
  4. Windows Server 2003 DNS服务安装篇
  5. ITPro Magazine2006年第6期发布
  6. 【计算机网络复习 数据链路层】3.5.4 CSMA-CD协议
  7. node ajax配置文件,如何存储Node.js部署设置/配置文件?
  8. 全国dns服务器地址
  9. ue设置MySQL_MySQL的安装与配置——详细教程 - Winton-Q
  10. java cancel_java – Future.cancel(boolean)方法的实用程序
  11. Jaas demo 登陆验证
  12. ThinkPHP6 操作SharePoint
  13. PS滤镜-Topaz Photoshop Plugins Bundle
  14. 算法——最好理解的动态规划之01背包详解(看完这篇再不敢说自己不知道01背包算法!!!)
  15. commit rollback操作产生undo和redo?
  16. android shape自定义渐变,Android实现 Shape属性gradient 渐变效果
  17. 小组取什么名字好_给小组取个好名字
  18. 一口气推荐16个让人震惊的黑科技工具
  19. Linux系统中nacos下载安装
  20. 经典算法-递归-角谷定理

热门文章

  1. python创建一个字符串变量 apple is_python-examples
  2. 数据降维:主成分分析法
  3. HTTP Content-Length深入实践
  4. Java对比俩个集合的异同
  5. 权限系统该如何设计?
  6. async awit 异步调用的理解及应用
  7. 无法使用evince命令打开pdf文档
  8. 消息队列的数据积压问题
  9. Android视频选取封面 glide无法更新图片的问题解决
  10. 使用大包ping对端进行MTU不一致的故障处理