题目描述

设r是个2^k 进制数,并满足以下条件:

(1)r至少是个2位的2^k 进制数。

(2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位。

(3)将r转换为2进制数q后,则q的总位数不超过w。

在这里,正整数k(1≤k≤9)和w(k<W< span>≤30000)是事先给定的。

问:满足上述条件的不同的r共有多少个?

我们再从另一角度作些解释:设S是长度为w 的01字符串(即字符串S由w个“0”或“1”组成),S对应于上述条件(3)中的q。将S从右起划分为若干个长度为k 的段,每段对应一位2^k进制的数,如果S至少可分成2段,则S所对应的二进制数又可以转换为上述的2^k 进制数r。

例:设k=3,w=7。则r是个八进制数(23=8)。由于w=7,长度为7的01字符串按3位一段分,可分为3段(即1,3,3,左边第一段只有一个二进制位),则满足条件的八进制数有:

2位数:高位为1:6个(即12,13,14,15,16,17),高位为2:5个,…,高位为6:1个(即67)。共6+5+…+1=21个。

3位数:高位只能是1,第2位为2:5个(即123,124,125,126,127),第2位为3:4个,…,第2位为6:1个(即167)。共5+4+…+1=15个。

所以,满足要求的r共有36个。

输入输出格式

输入格式:

输入只有1行,为两个正整数,用一个空格隔开:

k W

输出格式:

输出为1行,是一个正整数,为所求的计算结果,即满足条件的不同的r的个数(用十进制数表示),要求最高位不得为0,各数字之间不得插入数字以外的其他字符(例如空格、换行符、逗号等)。

(提示:作为结果的正整数可能很大,但不会超过200位)

输入输出样例

输入样例#1:

3 7
输出样例#1:

36

说明

NOIP 2006 提高组 第四题

数学统计

显然2^k进制数可以转化成二进制数分析。

比如8位的二进制数 00000000,如果要组成2^3进制,需要每3个数划分成一段: 00|000|000

000三位可能会有2^3-1种可能(1~7)

如果每段长度都相等,由于每段可能组成的数相同,而实际组成的几个数各不相同,所以总方案数可以用组合数计算:c[2^k-1][n]  (共有n段)

而如果第一段长度与后面的不等,需要单独考虑: c[2^k-(首段选择的数字i)][w/k]     1<=i<2^(首段二进制位数) && 2^k-i>w/k   ←需要给后面的数留出位置

 /*By SilverN*/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
struct num{
short int len;
int a[];
}c[][];
int n,k;
num c1,ans;
num gadd(num a,num b){
memset(c1.a,,sizeof c1.a);
c1.len=max(a.len,b.len);
for(int i=;i<=c1.len;++i){
c1.a[i]+=a.a[i]+b.a[i];
c1.a[i+]+=c1.a[i]/;
c1.a[i]%=;
}
if(c1.a[c1.len+]) c1.len++;
return c1;
}
void Print(){
printf("%d",ans.a[ans.len]);
for(int i=ans.len-;i>;--i){
printf("%d",ans.a[i]/);
printf("%d",ans.a[i]/%);
printf("%d",ans.a[i]/%);
printf("%d",ans.a[i]%);
}
printf("\n");
}
int main(){
k=read();n=read();
int hk=<<(n%k);
int tk=<<k;
int i,j;
for(i=;i<=tk;++i){
for(j=;j<=i;++j){
if(!j || !i){c[i][j].len=;c[i][j].a[]=;}
else c[i][j]=gadd(c[i-][j],c[i-][j-]);
}
}
ans.len=;
for(i=;i<=n/k && i<tk;++i)ans=gadd(ans,c[tk-][i]);
for(i=;i<hk && n/k+i<tk;++i) ans=gadd(ans,c[tk-i-][n/k]);
Print();
return ;
}

[NOIP2006] 提高组 洛谷P1066 2^k进制数的更多相关文章

  1. 洛谷 P1066 2^k进制数

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

  2. 洛谷P1066 2^k进制数

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

  3. 洛谷P1066 2^k进制数(题解)(递推版)

    https://www.luogu.org/problemnew/show/P1066(题目传送) (题解)https://www.luogu.org/problemnew/solution/P106 ...

  4. [NOIP2006] 提高组 洛谷P1064 金明的预算方案

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今 ...

  5. [NOIP2006] 提高组 洛谷P1063 能量项链

    题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定 ...

  6. [NOIP2006] 提高组 洛谷P1065 作业调度方案

    题目描述 我们现在要利用m台机器加工n个工件,每个工件都有m道工序,每道工序都在不同的指定的机器上完成.每个工件的每道工序都有指定的加工时间. 每个工件的每个工序称为一个操作,我们用记号j-k表示一个 ...

  7. 洛谷1066 2^k进制数

    原题链接 大力猜结论竟然猜对了.. 对于一对\(k,w\),我们可以把\(w\)位划分成\(k\)位一段的形式,每一段就是转换成十进制后的一位,这个从题面的解释中应该可以理解. 先不考虑可能多出(即剩 ...

  8. [luogu]P1066 2^k进制数[数学][递推][高精度]

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

  9. [NOIP2000] 提高组 洛谷P1017 进制转换

    题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 1*10^2+2*10^1+3*10^ ...

随机推荐

  1. chart.js图表 传值问题

    php:         $json['status'] = ture;                $json['list']=implode(',',$data);                ...

  2. 前端--1、HTML基础

    web服务 处于应用层的http协议负责的数据传输与解析.位于socket上层,用socket传输http数据时需要在消息开头处声明是http协议/相应http版本 状态码 状态码含义 \r\n\r\ ...

  3. Fresco 源码分析(序)

    1. 为什么要写这个分析的博客 其实关于Fresco的相关内容,大家上网搜索,一般可以找到一大推,但是为什么我还要写关于这个的呢,因为在网上搜索中文和英文的关于fresco的相关知识时,大家只是潜在的 ...

  4. 总结几点sql语句优化

    一.表设计阶段: 1.主键的使用    a.业务日志表.安全审计表采用自增长:    b.自定义编号用于业务流程类表,根据一定的编号规则:    c.int型主键 用于基础数据表: 2.逻辑删除字段的 ...

  5. TP-LINK路由器桥接功能实现(WDS)

    弄过好几次路由器的桥接了,但每次都忘记了,要重新找资料.在此记录一下,方便以后使用. 准备工作: 1.设置本地连接/无线网络连接(取决于用哪个配置路由器):IP-192.168.1.100 掩码-25 ...

  6. 四则运算 来自 http://www.cnblogs.com/ys1101/p/4368103.html

    #include<stdio.h> #include<math.h> #include<windows.h> ; ; void add() { int a,b,c, ...

  7. 浮动qq客服备份代码

    <div class="main-im"> <div id="open_im" class="open-im"> & ...

  8. Java锁,真的有这么复杂吗?

    为什么使用synchronizedvolatile,在多线程下可以保证变量的可见性,但是不能保证原子性,下面一段代码说明: 运行上面代码,会发现输出flag的值不是理想中10000,虽然volatil ...

  9. ALTER OPERATOR CLASS - 修改一个操作符表的定义

    SYNOPSIS ALTER OPERATOR CLASS name USING index_method RENAME TO newname DESCRIPTION 描述 ALTER OPERATO ...

  10. java_String类练习

    public class StringTest { //1.模拟trim方法,去除字符串两端的空格 public static void main(String[] args) { String st ...