组合数学练习题(一)——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 ... 
随机推荐
- 通过XMLHttpRequest,ActiveXObject实现ajax请求
			今天学习了原生的ajax请求.我将涉及到的ajax请求方法封装成了一个对象: var xhr={ getXHR:function(){ var XHR = null; ... 
- 使用Guava适配不同的callback
			Cache<Key,Value> cache =CacheBuilder.newBuilder() .maximumSize(1000) .build();// look Ma, no C ... 
- Deepin-安装git
			sudo apt-get install git 命令介绍(安装软件):apt-get install 命令介绍(Debian系列以管理员运行的前缀):sudo 
- Deepin-文件目录介绍
			请参见这篇文件:来自一个强大的网站 我主要介绍的就是: 下面所列文件,全部添加进了path目录(Linux查找命令,请参见man.linux,无论是find 或者是 which等) Deepin默认可 ... 
- LoadRunner 比较字符串是否相等
			int strcmp ( const char *string1, const char *string2 );大小写敏感.int stricmp ( const char *string1, con ... 
- HDU 1160 FatMouse's Speed(DP)
			题意 输入n个老鼠的体重和速度 从里面找出最长的序列 是的重量递增时速度递减 简单的DP 令d[i]表示以第i个老鼠为所求序列最后一个时序列的长度 对与每一个老鼠i 遍历全部老鼠j 当 ... 
- 一个有意思的Ruby Webdriver超时问题的解决过程
			rescue in receive 由于写ruby的时候感觉混身上下都拽起来了,所以比較喜欢用ruby写代码. 今天遇到了一个webdriver timeout的问题,问题本身还是由于我对webdri ... 
- android 浮动窗体学习笔记及个人理解(仿360手机助手)
			很感谢原文作者 http://blog.csdn.net/guolin_blog/article/details/8689140 经自己理解 程序执行界面例如以下图: 1.程序入口界面 2.小浮动窗体 ... 
- Windows下的Jupyter Notebook 的介绍(写给新手)(图文详解)
			不多说,直接上干货! Windows下的Python 3.6.1的下载与安装(适合32bits和64bits)(图文详解) Windows下的Jupyter Notebook 安装与自定义启动(图文详 ... 
- Java 中 泛型的限定
			泛型 一般 出如今集合中,迭代器中 也会出现! 泛型 是为了 提高代码的 安全性. 泛型 确保数据类型的唯一性. 在我们经常使用的容器中. 越是 单一 约优点理啊! ... 
