洛谷 P6075 [JSOI2015]子集选取
链接:P6075
前言:
虽然其他大佬们的走分界线的方法比我巧妙多了,但还是提供一种思路。
题意:
%&¥……@#直接看题面理解罢。
分析过程:
看到这样的题面我脑里第一反应就是DP,但是看到n和k的范围只能作罢。想到各种柿子又根本推不出来,于是颓废地打了个复杂度算不来的貌似是 \(2^{n^3}\) 的深搜。于是有以下测试:
input output
1 2 4
2 2 16
3 2 64
1 3 8
2 3 64
3 3 512
于是我们惊喜地发现答案貌似就是\(2^{kn}\)。但这个答案到底是怎么来的呢?
证明:
我们发现对这道题,所谓集合是可以拆解成n个元素分别处理的,可将其视为从三角形左上角起向右下进行连续的覆盖,如图:

那么设一个元素在大小为k的三角形内的覆盖方案数为 \(f(k)\) ,那么n个元素的方案总数即为 \(f(k)^n\) 。接下来来推 \(f(k)\) ,注意以下推理仍只关注一个元素。
对于一个大小为k的三角形,我们着重分析最下面一行,因为去掉这一行就能转化为更小的三角形,将覆盖,未覆盖以及任意取值分别看做“1”,“0”,和“?”,那么根据题意,这一行的状况只能是前面m个1,后面k-m个0,分情况讨论。
- 如果这行全部为零,即 :

发现当前的方案数即为上面未确定三角形的方案数\(f(k-1)\)。
- 如果前面有
m\((1\le m< k-1 )\) 个1,即:

发现当前的方案数即为右上角缺失的三角形的方案数\(f(k-1-m)\)。
- 如果前面有
k-1个1,即:

那么最后一位可填0或1,共2种方案。
总结一下,发现第一种和第二种可合并为\(\sum\limits_{i=1}^{k-1}f(i)\),为了美观,我们设 \(f(0)\) 为2,即可将第三种情况也合并,即:
\(f(k)=\sum\limits_{i=0}^{k-1}f(i),f(0)=2\)
- 当\(k=1\)时
\(f(1)=f(0)=2=2^1\)
- 当\(k>1\)时
因为\(f(k-1)=\sum\limits_{i=0}^{k-2}f(i)\)
所以\(f(k)=\sum\limits_{i=0}^{k-1}f(i)=\sum\limits_{i=0}^{k-2}f(i)+f(k-1)=2*f(k-1)\)
综上,\(f(k)=2^k\)
那么那么n个元素的方案总数即为\(f(k)^n\)即\(2^{kn}\)。
优化:
呐有人就要问了这不就是个快速幂板子题吗,有什么优化?对不起的确是有的。
由于我们取模的数1,000,000,007是个质数,所以有费马小定理:\(a^{p-1}\equiv 1\pmod p\),也就是说我们可以对指数取模从而减少那么几次运算量,即\(2^{kn\mod 1000000006}\)
代码:
不就是个快速幂板子吗,就不放代码了。
题外话:
很睿智的作者看到 n , k 的范围大,于是反手就把k*n对1,000,000,007取了个模。(100->40)
有人就要问了,这道绿题你写这么长给谁看啊?没错这篇题解就是我用来练\(\LaTeX\)的!
洛谷 P6075 [JSOI2015]子集选取的更多相关文章
- 洛谷 P5502 - [JSOI2015]最大公约数(区间 gcd 的性质+分治)
洛谷题面传送门 学校模拟赛的某道题让我联想到了这道题-- 先讲一下我的野鸡做法. 首先考虑分治,对于左右端点都在 \([L,R]\) 中的区间我们将其分成三类:完全包含于 \([L,mid]\) 的区 ...
- BZOJ4475[Jsoi2015]子集选取——递推(结论题)
题目描述 输入 输入包含一行两个整数N和K,1<=N,K<=10^9 输出 一行一个整数,表示不同方案数目模1,000,000,007的值. 样例输入 2 2 样例输出 16 可以发现 ...
- BZOJ4475 [Jsoi2015]子集选取
Description 有一些\(\{1\dots n\}\)的子集\(A_{i,j}, 1\leq j\leq i\leq k\)共\(\frac{k(k+1)}2\)个,满足\(A_{i,j}\s ...
- [题解] LuoguP6075 [JSOI2015]子集选取
传送门 ps: 下面\(n\)和\(k\)好像和题目里的写反了...将就着看吧\(qwq\) 暴力打个表答案就出来了? 先写个结论,答案就是\(2^{nk}\). 为啥呢? 首先你需要知道,因为一个集 ...
- BZOJ4475: [Jsoi2015]子集选取【找规律】【数学】
Description Input 输入包含一行两个整数N和K,1<=N,K<=10^9 Output 一行一个整数,表示不同方案数目模1,000,000,007的值. Sample In ...
- [BZOJ4475][JSOI2015]子集选取[推导]
题意 题目链接 分析 显然可以看成一个位数为 \(n\) 的二进制数然后每一位分开考虑然后求和.最后的答案是 \(w^n\) 的形式. 考虑一个dp. 定义状态 \(f_{i}\) 表示选择了长度为 ...
- BZOJ4475 JSOI2015子集选取(动态规划)
数据范围过大说明这个题和组合一点关系也没有,答案基本上肯定是ab的形式了.暴力打表感觉不太好写,找到当年的题面发现还有个样例是6 40 401898087,于是暴力找ab=401898087的数,发现 ...
- 【BZOJ4475】 [Jsoi2015]子集选取
题目描述 数据范围 \(1\leq N,K \leq 10^9\) \(solution\) 集合S中每个元素互不影响,不妨依次考虑其中一个元素在三角形中的出现情况 问题转化为一个\(0/1\)的三角 ...
- bzoj 4475: [Jsoi2015]子集选取
233,扒题解的时候偷瞄到这个题的题解了,,GG 暴力发现是2^(nm),然后就是sb题了 #include <bits/stdc++.h> #define LL long long us ...
随机推荐
- PTA 面向对象程序设计 6-1 引用作函数形参交换两个整数
引用作函数形参交换两个整数 设计一个void类型的函数Swap,该函数有两个引用类型的参数,函数功能为实现两个整数交换的操作. 裁判测试程序样例: #include <iostream> ...
- PHP的bz2压缩扩展工具
在日常的开发和电脑使用中,我们经常会接触到压缩和解压的一些工具,PHP 也为我们准备了很多相关的操作扩展包,都有直接可用的函数能够方便的操作一些压缩解压功能.今天,我们先学习一个比较简单但不太常用的压 ...
- PHP中的强制类型转换
学过静态语言开发的朋友对类型转换不会陌生,比如Java.C#.C++等.静态语言的好处就是变量强制必须指定类型,这也是编译的要求,所以大部分编译型的语言都会有强制变量类型的要求.而PHP据说也会在PH ...
- adb devices如何连逍遥模拟器的设备
adb device连接真机,上一篇已经讲过了,这篇讲如何连接模拟器.这里我用的模拟器逍遥模拟器.我先插上手机,另外启动了一个模拟器,直接在cmd中输入adb devices,按理应该有2个设备id, ...
- genymotion启动模拟器后,sdk查询adb devices为空-解决方案
我们在genymotion中安装了一个安卓模拟器,比如Google Nexus 4,启动该模拟器后,在cmd中输入adb devices,发现为空. 解决方案:在genymotion选择Setting ...
- pyqt5实现窗口跳转并关闭上一个窗口
关键在于要定义一个关闭窗体的函数colsewin() 然后将按键与该函数连接(connect)在一起即可 import sys from PyQt5.QtWidgets import QMainWin ...
- 『GoLang』控制结构
条件语句 if 是用于测试某个条件(布尔型或逻辑型)的语句,如果该条件成立,则会执行if后由大括号括起来的代码块,否则就忽略该代码块继续执行后续的代码. if condition { // do so ...
- Keras函数——keras.callbacks.ModelCheckpoint()及模型的训练
keras.callbacks.ModelCheckpoint(filepath, monitor='val_loss', verbose=0, save_best_only=False, save_ ...
- vue成就购物城的功能 (展示增删改查)
<!DOCTYPE html><html> <!DOCTYPE html> <html> <head> <meta charset=& ...
- css的公共属性及原因
在我们写多个网页的时候,会发现总会遇到很多相同的css样式,若是每次都要在网页代码中写,会浪费时间,同时也会消耗浏览器和计算机的性能.因此,我个人将我敲代码过程中的经常用到的css样式总结了一下.再用 ...