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

(题解)https://www.luogu.org/problemnew/solution/P1066;

首先普及一下知识:一个2^k进制n位数转换成2进制数时最多有n*k位;一个n进制数的每位数字属于集合{0,1,……,n-1}。

这样我们就知道给出w、k后r的位数最多为wei=w/k向上取整,但要注意,如果w%k有余,则r在最高位上不能把集合{0,1,……,n-1}的数都取一遍。

又知道r的位数可以是2到wei的任意一个数,且r的位数为i时的状态又可以从r的位数为i-1推过来:

  设数组a[i][j]表示r的位数为i、第i位为j时所有符合条件r的数目,则a[i][j]=a[i-1][j+1]+……+a[i-1][2^k-1]。

由此我们可以从r的位数为2时一直推至r的位数为wei。最后别忘了最高位的特殊处理。

AC代码:

 #include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a[][][],tot[],mmax;
int pow(int a,int b)
{
int ans=,with=a;
while(b)
{
if(b&) ans*=with;
with*=with;
b>>=;
}
return ans;
}
void jiafa(int j[],int a[])
{
int lb=;
while(lb<=j[]||lb<=a[])
{
j[lb]+=a[lb];
if(j[lb]>=)
{
j[lb]%=;
j[lb+]++;
}
lb++;
}
while(j[lb]>=)
{
j[lb]%=;
lb++;
j[lb]++;
}
while(!j[lb]&&lb>) lb--;
if(lb>j[]) j[]=lb;
}
void jiafa1(int a[],int b)
{
int lb=;
while(b)
{
a[++lb]=b%;
b/=;
}
a[]=lb;
jiafa(tot,a);
}
int main()
{
int k,w;
cin>>k>>w;
int g=w/k;
bool youyu=;
int mmax2;
if(w%k)
{
g++;
youyu=;
mmax2=pow(,w%k)-;
}
mmax=pow(,k)-;
for(int i=;i<mmax;i++) jiafa1(a[][i],mmax-i);
int l=,n=;
for(int i=;i<=g;i++)
{
if(i==g&&youyu&&mmax2<mmax)
{
for(int i=mmax-;i>mmax2;i--)
jiafa(a[n][mmax2],a[l][i]);
jiafa(tot,a[n][mmax2]);
for(int j=mmax2-;j>=;j--)
{
memcpy(a[n][j],a[n][j+],sizeof(a[n][j+]));
jiafa(a[n][j],a[l][j+]);
jiafa(tot,a[n][j]);
}
break;
}
jiafa(a[n][mmax-],a[l][mmax]);
jiafa(tot,a[n][mmax-]);
for(int j=mmax-;j>=;j--)
{
memcpy(a[n][j],a[n][j+],sizeof(a[n][j+]));
jiafa(a[n][j],a[l][j+]);
jiafa(tot,a[n][j]);
}
for(int j=;j<=mmax;j++)
memset(a[l][j],,sizeof(a[l][j]));
n++;l++;
if(n==) n=;
if(l==) l=;
}
int lt=tot[];
while(!tot[lt]&&lt>) lt--;
for(;lt>;lt--) cout<<tot[lt];
return ;
}

洛谷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. [luogu]P1066 2^k进制数[数学][递推][高精度]

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

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

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

  5. 洛谷1066 2^k进制数

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

  6. C#版 - Leetcode 504. 七进制数 - 题解

    C#版 - Leetcode 504. 七进制数 - 题解 Leetcode 504. Base 7 在线提交: https://leetcode.com/problems/base-7/ 题目描述 ...

  7. P1066 2^k进制数

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

  8. [递归回溯] LeetCode 504七进制数(摸鱼版)

    LeetCode 七进制数 前言: 这个就没什么好说的了 题目:略 步入正题 进位制转换 10 -n 余数加倒叙 没什么好讲的直接上七进制代码 偷个懒 10进位制转7 class Solution { ...

  9. [Luogu P1066] 2^k进制数 (组合数或DP)

    题面 传送门:https://www.luogu.org/problemnew/show/P1066 Solution 这是一道神奇的题目,我们有两种方法来处理这个问题,一种是DP,一种是组合数. 这 ...

随机推荐

  1. es6 字符串的扩展和数值的扩展

    es6字符串的扩展 1. es6新增的一些方法 1.1 includes 判断是否包括在内,返回一个 true or false 1.2 statsWith 判断是否以什么开头,返回一个 true o ...

  2. git push完代码 想撤回 并保留之前修改的代码 / 修改完代码 发现分支不对 想切换分支 /恢复已修改的文件

    git reset --soft xxxx // xxxx是版本号 回退 git stash //保留当前分支修改的代码 git checkout xxx //切换到xxx分支 git stash l ...

  3. js当地天气调用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 46.Odoo产品分析 (五) – 定制板块(2) – 为业务自定义odoo(1)

    查看Odoo产品分析系列--目录 在这一章节中,将学习到如何设置"开发者模式"以及备份数据库:然后学习如何添加字段到数据库并在表单和视图中显示. 1 了解odoo的构架 每一个应用 ...

  5. Fragment生命周期以及使用时的小问题

    前言- 昨天在写UI的时候用到了FRAGMENT,发现自己对此还不是非常了解,借此机会记录一下 Fragment的生命周期- 官方生命周期图: Fragment每个生命周期方法的意义.作用- onVi ...

  6. 数据文件实时同步(rsync + sersync2)

    因近期项目需求,需要同步云端服务器的数据给**方做大数据分析. 思路: 起初只要数据同步,准备开放数据采集接口.但实时性较差,会有延迟. 故而寻觅各种解决方案,最终确定使用 rsync 进行文件同步, ...

  7. [20190418]exclusive latch spin count.txt

    [20190418]exclusive latch spin count.txt--//昨天测试"process allocation" latch,主要这个latch与其它拴锁s ...

  8. js用canvans 实现简单的粒子运动

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  9. .net c#将数据库数据对象转换为实体值对象

    using System; using System.Data; namespace Sunlib { public static class DataHelper { //将数据库数据对象转换为实体 ...

  10. ORM(二)常用字段小记

    常用字段类型: AutoField:字段自增,多用于ID主键字段,每个表中只能有一个AutoField字段类型. id = models.AutoField(primary_key=True) # 设 ...