Luogu P1066 2^k进制数 组合数学
分两种情况:$k|n$和$k$不整除$n$
如果$k|n$,那么长度为$n$的二进制数就能被恰好分成$n/k$个块;所以若某个数长度是$x$个块,由于每个块内能填不同的$2^k-1$个数,那么就有$C_{2^k-1}^{x}$
所以整除时答案是$\sum_{i=2}^{n/k} \space C_{2^k-1}^{i}$
如果$k$不整除$n$,那么一共会分成$\lfloor \frac{n}{k} \rfloor+1$块,而最后一个不完整的块只有$n\text{mod} k$位,能选择的数还是$0$到$2^{n\text{ } \text{mod} \text{ }k}-1$
如果这个最高位选择填$0$那么回到了$k|n$的情况,所以最高位填0的方案数为$\sum_{i=2}^{\left \lfloor\frac{n}{k}\right \rfloor} C_{2^k-1}^{i}$
之后最高位还可以填$1$到$2^{n\text{ } \text{mod} \text{ }k}-1$,如果我们选择填$i$的话,那么后面的块内要填比$i$大的数,所以剩下的每个块内可以填的就有$2^k-1-i$个数,所以方案数就是$C_{2^k-1-i}^{\left \lfloor\frac{n}{k}\right \rfloor}$
所以最后的答案还应该加上$\sum_{i=1}^{2^{n\text{ } \text{mod} \text{ }k} \space \space \space -1} \space C_{2^k-1-i}^{\left \lfloor\frac{n}{k}\right \rfloor}$
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<vector>
#include<map>
#include<set>
#define ll long long
#define R register int
static char B[<<],*S=B,*D=B;
#define getchar() (S==D&&(D=(S=B)+fread(B,1,1<<15,stdin),S==D)?EOF:*S++)
using namespace std;
inline int g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
} short c[]; int n,k,p,res,t;
inline string add(string a,string b) {
R lena=a.size(),lenb=b.size(); reverse(a.begin(),a.end()),reverse(b.begin(),b.end()); memset(c,,sizeof(c));
R p=; for(;p<max(lena,lenb)||c[p];++p) c[p]+=(int)(p<lena?:)*(a[p]-)+(int)(p<lenb?:)*(b[p]-),c[p+]+=c[p]/,c[p]%=;
string ret="\0"; for(R i=p-;~i;--i) ret.insert(ret.end(),char(c[i]+));
reverse(a.begin(),a.end()),reverse(b.begin(),b.end()); return ret;
}
string ans;
string C[][];
signed main() {
k=g(),n=g(),p=n/k,res=n%k;
t=(<<k)-,C[][]="";
for(R i=;i<=t;++i) { C[i][]="";
for(R j=;j<i;++j) C[i][j]=add(C[i-][j],C[i-][j-]); C[i][i]="";
} for(R i=;i<=p;++i) {
if(i>t) break; ans=add(ans,C[t][i]);
} R lim=(<<res)-;
for(R i=;i<=lim;++i) {
if(p>t-i) break; ans=add(ans,C[t-i][p]);
} cout<<ans<<endl;
}
2019.06.05
Luogu P1066 2^k进制数 组合数学的更多相关文章
- [luogu]P1066 2^k进制数[数学][递推][高精度]
[luogu]P1066 2^k进制数 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻 ...
- [Luogu P1066] 2^k进制数 (组合数或DP)
题面 传送门:https://www.luogu.org/problemnew/show/P1066 Solution 这是一道神奇的题目,我们有两种方法来处理这个问题,一种是DP,一种是组合数. 这 ...
- 洛谷 P1066 2^k进制数
P1066 2^k进制数 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. ( ...
- 洛谷P1066 2^k进制数
P1066 2^k进制数 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. ( ...
- 洛谷P1066 2^k进制数(题解)(递推版)
https://www.luogu.org/problemnew/show/P1066(题目传送) (题解)https://www.luogu.org/problemnew/solution/P106 ...
- P1066 2^k进制数
传送门 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. (3)将r转换为2进 ...
- [NOIP2006] 提高组 洛谷P1066 2^k进制数
题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. (3)将r转换为2进制数q后 ...
- 【洛谷p1066】2^k进制数
(不会敲键盘惹qwq) 2^k进制数[传送门] 算法标签: (又是一个提高+省选-的题) 如果我说我没听懂你信吗 代码qwq: #include<iostream> #include< ...
- 蓝桥杯 问题 1110: 2^k进制数 (排列组合+高精度巧妙处理)
题目链接 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. (3)将r转换为2 ...
随机推荐
- 解决:Could not resolve bean definition resource pattern [/WEB-INF/classes/spring/applicationContext-*.xml]
问题: 用Maven搭建spring.springmvc.mybatis时,运行报错: org.springframework.beans.factory.BeanDefinitionStoreExc ...
- python如何切割字符串
python字符串的分割方法如下 str.split():字符串分割函数 通过指定分隔符对字符串进行切片,并返回分割后的字符串列表. 语法: str.split(s, num)[n] 参数说明: s: ...
- Python初学者常见错误详解
Python初学者常见错误详解 0.忘记写冒号 在 if.elif.else.for.while.class.def 语句后面忘记添加 “:” if spam == 42 print('Hello ...
- 【转载】STM32 IAP 在线升级详解
(扩展-IAP主要用于产品出厂后应用程序的更新作用,考虑到出厂时要先烧写IAP 再烧写APP应用程序要烧写2次增加工人劳动力基础上写了“STM32 IAP+APP ==>双剑合一”链接稍后 ...
- Python 语言简介与入门
Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...
- c# ServiceStack web 搭建
用的是4.5的.net版本 构建model /// <summary> /// 通过id获取资料 /// </summary> //[Route("/GetStude ...
- Hexo折腾记--小白修改新主题
UPDATE 2019.5.28 不好意思我又换了个新主题ARIA啦...这回没有个人定制了 前言 如果您曾经来过我的博客,就会发现我的个人博客(https://rye-catcher.github. ...
- js之数据类型(对象类型——构造器对象——正则)
正则(regular expression)描述了一种字符串的匹配式.一般应用在一些方法中,用一些特殊的符号去代表一些特定的内容,对字符串中的信息实现查找,替换,和提取的操作.js中的正则表达式用Re ...
- 用表格制作商品购买页面--(table)
实现效果如图: 首先来看布局,头部图片,内容从左到右分为四个部分 勾选+商品图片+商品名/买家+价格, 所以需要将头部用<td>包括起来,并且设置<td colspan=&quo ...
- NSInvocation简单总结
(1)用法 NSInvocation是调用函数的另一种方式,它将调用者,函数名,参数封装到一个对象,然后通过一个invoke函数来执行被调用的函数,其思想就是命令者模式,将请求封装成对象. 例如,有这 ...