传送门

好好看题

看懂了就不难了

在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进制数相关推荐

  1. P1066 2^k进制数 NOIP 2006 提高组 第四题

    洛谷蓝题(点击跳转) 提高组 第四题 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的 ...

  2. [NOIP2006] 提高组 洛谷P1066 2^k进制数

    题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. (3)将r转换为2进制数q后 ...

  3. 十六进制190的2进制数_十六进制数系统解释

    十六进制190的2进制数 Hexadecimal numbers, often shortened to "hex numbers" or "hex", are ...

  4. (C++)除基取余法:将十进制数转化为Q进制数

    所谓基,就是指将要转换成的进制Q. 除基取余的意思就是:每次将待转换数除以Q,然后将得到的余数作为低位存储,而商则继续除以Q并重复上面的操作,直至商0时,将所有位从高到低输出就可以得到Q进制数. 代码 ...

  5. 16进制数组转成10进制 qt_计算机组成原理(进制数及转换)

    图片来源于网络 都知道计算机数据是以二进制数0和1补码的形式存储在内存中. 那你知道它们转换关系吗?那么问题来了,为什么要转换? 前面已经说过计算机数据是以二进制0和1存储,所以它们要转换为二进制存储 ...

  6. 16进制/10进制数转化为浮点型案例

    #include <stdio.h> #include <stdint.h> //共用体,单精度浮点型和整型数共用内存存储 typedef union {    float f ...

  7. byte数组转字符串_VS2012 C# 16进制数与字符串的互换

    #编程基础##我要上头条# 一.字符串转换为16进制字节数组的步骤 1.将字符串按每两个字符拆分并插入逗号为分隔符: 2.将拆分后的字符串分离为字符串数组: 3.将字符串数组转换成字节数组并检测字符是 ...

  8. m进制数转换为十进制数

    m进制数(m<10)转换为十进制数 问题描述:将一个m进制数转换成十进制数字 问题分析:首先将输入的m进制数存储到列表里面,然后根据每个数位上的权值(幂次)的不同,计算出对应的十进制数. 代码如 ...

  9. 编程实现将一个N进制数转换成M进制数

    问题:编程实现将一个N进制数转换成M进制数.(c/c++.Java.Javascript.C#.Python) 1.Python 手写算法版 def conversion_num(num, src, ...

最新文章

  1. 机器学习系列之手把手教你实现一个 naiveBayes
  2. 仅通过崩溃地址找出源代码的出错行
  3. 想靠写程序赚更多钱,写到两眼通红,写得比别人都又快又好好几倍,结果又能如何?...
  4. 基于YARN集群构建运行PySpark Application
  5. JavaScript为事件处理器传递参数 (转)
  6. 【干货贴】消息队列如何利用标签实现消息过滤
  7. 找出满足要求的三位数
  8. 初探Object Pascal的类(七)
  9. html静态网页制作天天生鲜,天天生鲜 前后台资源
  10. python爬虫案例——爬取豆瓣图书信息并保存
  11. 关于数据库字段模糊查询
  12. 绿云酒店管理系统 服务器要求,绿云宾馆管理软件-系统基础.doc
  13. 临时邮箱有什么用,推荐5个临时邮箱
  14. win10网卡驱动问题
  15. iCloud Drive,简单实用的苹果原生云存储
  16. 一起Talk Android吧(第一百八十六回:Android中的AsyncTask机制五)
  17. Android 隐藏手机号中间四位和邮箱隐藏
  18. MATLAB 交通限速标志识别 限速识别 分割 图像处理 程序 代码
  19. 2023 iapp彩虹网盘云盘系统源码
  20. 系统维护盘Windwos PE的使用

热门文章

  1. Python入门--列表元素的增加操作,append(),extend(),insert(),切片
  2. JQueryDOM之样式操作
  3. wdatepicker 设置只显示时分_液晶显示多功能电力仪表EX8-33
  4. Java常用算法二:分治法
  5. token详解及常见防范措施
  6. bzoj 1303: [CQOI2009]中位数图
  7. [paper reading] SSD
  8. docker-compose 使用
  9. 贺利坚老师汇编课程60笔记:逻辑移位指令shl和shr
  10. 使用IDEA创建一个Maven Web工程:无法创建Java Class文件