P1066 2^k进制数
传送门
好好看题
看懂了就不难了
在2^k进制下,一位一位看
每一位都有一些数可以填
除非是最左边一位,不然可以填的数最大都是 2^k-1
所以显然当填的位数为 i 时(不是最后一位),可能的选取方案总共有 C(2^k-1,i )
如果要填最后一位
最后一位可以填的最大的数为 2^ (w%k)-1
那就枚举一下最后的数,前面选取的数都要大于它
那么当最后的数为 i 时,前面的数选取方案数为 C( (2^k-1) -i,w/k)
(注意 w/k 可能很大,但是如果超过 2^9-1 那就没意义了(能够选的数最大只有 2^9-1))
因为答案很大,要用高精度
我用的是压位高精(借着这一题学了一下压位高精...)
(感谢crk大佬为我提供压位高精的代码 %%%)
最后要注意一下细节
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int wid=10000;//压位高精,每4位放一起 struct data {int a[52],len;data(){ memset(a,0,sizeof(a)); len=0; }//初始化data operator + (data &tmp)//重载加号 {data u; int x=0;u.len= len>tmp.len ? len : tmp.len;for(int i=1;i<=u.len;i++){u.a[i]=a[i]+tmp.a[i]+x;x=u.a[i]/wid; u.a[i]%=wid;}while(x) u.a[++u.len]=x%wid,x/=wid;return u;}data operator * (data &tmp)//重载乘号,其实用不上,顺便一起打了 {data u; int x=0;for(int i=1;i<=tmp.len;i++,x=0){for(int j=1;j<=len;j++){u.a[i+j-1]+=tmp.a[i]*a[j]+x;x=u.a[i+j-1]/wid; u.a[i+j-1]%=wid;}//注意细节u.a[i+len]+=x;}while(u.a[u.len+1]) u.a[u.len+2]+=u.a[u.len+1]/wid,u.a[(++u.len)+1]%=wid;//一堆细节..return u;}void print(){printf("%d",a[len]);for(int i=len-1;i;i--){for(int j=10;j*a[i]<wid;j*=10) printf("0");//如果压的数还不到4位就要补上0printf("%d",a[i]);}} }C[513][513],ans; int k,w,n,p; int main() {scanf("%d%d",&k,&w);n=(1<<k)-1; p=w/k>512 ? 512 : w/k;//p最大为512for(int i=0;i<=n;i++) C[i][0].a[1]=1,C[i][0].len=1;for(int i=1;i<=n;i++)for(int j=1;j<=i;j++)C[i][j]=C[i-1][j-1]+C[i-1][j];//求组合数for(int i=2;i<=p;i++) ans=ans+C[n][i];for(int i=(1<<w%k)-1;i;i--) ans=ans+C[n-i][p];//i不能取0,细节 ans.print();return 0; }
转载于:https://www.cnblogs.com/LLTYYC/p/9605859.html
P1066 2^k进制数相关推荐
- P1066 2^k进制数 NOIP 2006 提高组 第四题
洛谷蓝题(点击跳转) 提高组 第四题 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的 ...
- [NOIP2006] 提高组 洛谷P1066 2^k进制数
题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. (3)将r转换为2进制数q后 ...
- 十六进制190的2进制数_十六进制数系统解释
十六进制190的2进制数 Hexadecimal numbers, often shortened to "hex numbers" or "hex", are ...
- (C++)除基取余法:将十进制数转化为Q进制数
所谓基,就是指将要转换成的进制Q. 除基取余的意思就是:每次将待转换数除以Q,然后将得到的余数作为低位存储,而商则继续除以Q并重复上面的操作,直至商0时,将所有位从高到低输出就可以得到Q进制数. 代码 ...
- 16进制数组转成10进制 qt_计算机组成原理(进制数及转换)
图片来源于网络 都知道计算机数据是以二进制数0和1补码的形式存储在内存中. 那你知道它们转换关系吗?那么问题来了,为什么要转换? 前面已经说过计算机数据是以二进制0和1存储,所以它们要转换为二进制存储 ...
- 16进制/10进制数转化为浮点型案例
#include <stdio.h> #include <stdint.h> //共用体,单精度浮点型和整型数共用内存存储 typedef union { float f ...
- byte数组转字符串_VS2012 C# 16进制数与字符串的互换
#编程基础##我要上头条# 一.字符串转换为16进制字节数组的步骤 1.将字符串按每两个字符拆分并插入逗号为分隔符: 2.将拆分后的字符串分离为字符串数组: 3.将字符串数组转换成字节数组并检测字符是 ...
- m进制数转换为十进制数
m进制数(m<10)转换为十进制数 问题描述:将一个m进制数转换成十进制数字 问题分析:首先将输入的m进制数存储到列表里面,然后根据每个数位上的权值(幂次)的不同,计算出对应的十进制数. 代码如 ...
- 编程实现将一个N进制数转换成M进制数
问题:编程实现将一个N进制数转换成M进制数.(c/c++.Java.Javascript.C#.Python) 1.Python 手写算法版 def conversion_num(num, src, ...
最新文章
- 机器学习系列之手把手教你实现一个 naiveBayes
- 仅通过崩溃地址找出源代码的出错行
- 想靠写程序赚更多钱,写到两眼通红,写得比别人都又快又好好几倍,结果又能如何?...
- 基于YARN集群构建运行PySpark Application
- JavaScript为事件处理器传递参数 (转)
- 【干货贴】消息队列如何利用标签实现消息过滤
- 找出满足要求的三位数
- 初探Object Pascal的类(七)
- html静态网页制作天天生鲜,天天生鲜 前后台资源
- python爬虫案例——爬取豆瓣图书信息并保存
- 关于数据库字段模糊查询
- 绿云酒店管理系统 服务器要求,绿云宾馆管理软件-系统基础.doc
- 临时邮箱有什么用,推荐5个临时邮箱
- win10网卡驱动问题
- iCloud Drive,简单实用的苹果原生云存储
- 一起Talk Android吧(第一百八十六回:Android中的AsyncTask机制五)
- Android 隐藏手机号中间四位和邮箱隐藏
- MATLAB 交通限速标志识别 限速识别 分割 图像处理 程序 代码
- 2023 iapp彩虹网盘云盘系统源码
- 系统维护盘Windwos PE的使用
热门文章
- Python入门--列表元素的增加操作,append(),extend(),insert(),切片
- JQueryDOM之样式操作
- wdatepicker 设置只显示时分_液晶显示多功能电力仪表EX8-33
- Java常用算法二:分治法
- token详解及常见防范措施
- bzoj 1303: [CQOI2009]中位数图
- [paper reading] SSD
- docker-compose 使用
- 贺利坚老师汇编课程60笔记:逻辑移位指令shl和shr
- 使用IDEA创建一个Maven Web工程:无法创建Java Class文件