组合数学练习题(一)——Chemist
题意:
从 n 个人中选出不超过 k 个人,再在选出的人中选出一些人成为队员,再在队员中选一名队长,求不同的方案数。答案 mod 8388608。
共有T组询问,每次给你n和k。T ≤ 10^4 k ≤ n ≤ 10^5。
分析:
在n个人中选不超过k个人,即可以选择1,2,3...k个人,对于每种情况需要分别计算答案。(C(m,n)表示在n个人中选择m个数的方案数)设选i个人,那么共有C(i,n)种方案,对于每一种方案,在选择的i个人中再选择j名队员,有C(j,i)种方案,对于选择的j名队员,从中再选择一名队长共有C(1,j)=j种方案。根据乘法原理,在n人中选择i人再选择j名队员再选择1名队长的方案数为C(i,n)C(j,i)j。所以我们枚举i,j,再将所有的答案累加就是最终的方案数。
ans=∑(i:1~k)C(i,n)∑(j:1~i)C(j,i)j
但是这种做法的时间复杂度为O(T*k^2)=O(TLE)。那么我们让n个人中选择i个人的做法不变,考虑后面的做法,原做法是先选队员再选队长,我们可以考虑先选队长,共有C(1,i)=i种方案,然后对于剩下的i-1个人,他们既可以当队员又可以不当队员,每个人有两种可能,共有2^(i-1)种情况,优化后的答案为:
ans=∑(i:1~k)C(i,n)i2^(i-1)
2^(i-1)可以用快速幂计算,优化后的时间复杂度为O(Tklogk)还是会超时。那么怎么办呢???
看题!
要mod的数是偶数是不是很奇怪啊,仔细打量我们可以发现,8388608=2^23。而且我们的答案中也有2^(i-1)这种形式,那么当i-1>=23时就不需要计算了,因为mod完的数都为0,对答案没有贡献。这样我们就把复杂度进一步降到了O(T*min(k,23)),是不是非常小啊
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=(1<<23),M=1e5+10;
int T,n,k;
ll c[M][26];
void prework()
{
for(int i=0;i<=M;i++)
c[i][0]=1;
for(int i=1;i<=M;i++)
for(int j=1;j<=25;j++)
c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
}
int main()
{
prework();
scanf("%d",&T);
for(int j=1;j<=T;j++)
{
ll ans=0;
scanf("%d%d",&n,&k);
for(ll i=1;i<=min(k,24);i++)
{
ans+=(i*(1<<(i-1)))%mod*c[n][i];
ans%=mod;
}
printf("%lld\n",ans);
}
return 0;
}
组合数学练习题(一)——Chemist的更多相关文章
- 组合数学练习题(二)——Chemist
题意: 在一个 n 维无限空间中,一开始原点处有一个细胞.细胞每秒都会增殖,每个原有细胞都会消亡,在与它曼哈顿距离恰为 1的所有位置都会新增一个细胞.求 T 秒后,原点处会有多少细胞,答案 mod10 ...
- 组合数学1.4&3.10 By cellur925
本文引用于清华大学出版社卢开澄.卢华明<组合数学第五版>. 今天我们稍微讨论下圆排列以及$n$对夫妻的问题. 1.4圆周排列 这个问题是:从$n$个人中取$r$个在圆周上,我们用$Q(n, ...
- Linux基础练习题(二)
Linux基础练习题(二) 1.复制/etc/skel目录为/home/tuer1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限. [root@www ~]# cp -r ...
- shell 脚本之 shell 练习题汇总
整理了一些 shell 相关的练习题,记录到这里. 1. 请按照这样的日期格式 xxxx-xx-xx 每日生成一个文件,例如:今天生成的文件为 2013-09-23.log, 并且把磁盘的使用情况写到 ...
- MySQL练习题
MySQL练习题 一.表关系 请创建如下表,并创建相关约束 二.操作表 1.自行创建测试数据 2.查询“生物”课程比“物理”课程成绩高的所有学生的学号: 3.查询平均成绩大于60分的同学的学号和平均成 ...
- MySQL练习题参考答案
MySQL练习题参考答案 2.查询“生物”课程比“物理”课程成绩高的所有学生的学号: 思路: 获取所有有生物课程的人(学号,成绩) - 临时表 获取所有有物理课程的人(学号,成绩) - 临时表 根据[ ...
- mysql练习题-查询同时参加计算机和英语考试的学生的信息-遁地龙卷风
(-1)写在前面 文章参考http://blog.sina.com.cn/willcaty. 针对其中的一道练习题想出两种其他的答案,希望网友给出更多回答. (0) 基础数据 student表 +-- ...
- 【UOJ#228】基础数据结构练习题 线段树
#228. 基础数据结构练习题 题目链接:http://uoj.ac/problem/228 Solution 这题由于有区间+操作,所以和花神还是不一样的. 花神那道题,我们可以考虑每个数最多开根几 ...
- 【Java EE 学习 28 下】【Oracle面试题2道】【Oracle练习题3道】
一.已知程序和数据 create table test1 (id int primary key, name ), money int); ,); ,); ,); ,); 要求根据下图写出相应的sql ...
随机推荐
- poj——2239 Selecting Courses
poj——2239 Selecting Courses Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10656 A ...
- POJ 1511 【heap+dij】
题意: t组样例. 每组有n个节点,有m条单向边. 有m组输入,每组a b c 表示从a到b的单向边的权值是c. 求解,从编号为1的节点出发,有n-1个人,要求他们分别到达编号从2到n的节点再返回,所 ...
- 2017多校Round2(hdu6045~hdu6055)
补题进度:10/11 1001(不等式) 根据题意列不等式,解一解就行了 1002(套路) 题意: 给定一个随机产生的1e6*1e6的矩阵和一个1e3*1e3的矩阵,你要回答这个1e3*1e3的小矩阵 ...
- Linux内存管理-内核的shmall和shmmax参数(性能调优)(转)
内核的shmall和shmmax参数 SHMMAX=配置了最大的内存segment的大小:这个设置的比SGA_MAX_SIZE大比较好. SHMMIN=最小的内存segment的大小 SHMMNI=整 ...
- 【APUE】用户态与内核态的区别
当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态).此时处理器处于特权级最高的(0级)内核代码中 执行.当进程处于内核态时,执行的内核代码会使用当前进程 ...
- Lync 2013 与Exchange 2013 UM&UC 集成!
设置好对应的拨号计划.我们设置分机号码为4位: 配置好接入号码为5000: 配置自己主动助理号码为6000: 改动UM拨号模式为双模式: Set-UMService -identity Exch ...
- LeetCode 283 Move Zeroes(移动全部的零元素)
翻译 给定一个数字数组.写一个方法将全部的"0"移动到数组尾部.同一时候保持其余非零元素的相对位置不变. 比如,给定nums = [0, 1, 0, 3, 12],在调用你的函数之 ...
- javascript 语法规范错误提示代码
“Missing semicolon.” : “缺少分号.”, “Use the function form of \”use strict\”.” : “使用标准化定义function.”, “Un ...
- EditText设置光标位置问题
普通设置 EditText 光标显示位置的方法就是 et.setSelection(text.length()); et.setSelection(0); 设置0 就是第一位了. 设置text长度就最 ...
- 网络知识: 物理层PHY 和 网络层MAC
PHY模块简介 物理层位于OSI最底层,物理层协议定义电气信号.线的状态.时钟要求.数据编码和数据传输用的连接器. 物理层的器件称为PHY. 上图里的灰色方框图里的就是PHY芯片内部模块图. MAC器 ...