题目简述

给定N 求1到N中有多少个幸运数字 幸运数字的定义为 这个数能被它二进制表示下1的个数整除

其中(1 ≤ N ≤ 1019)

--------------------------------------------------------------------------------------------------------------------------------

第二道数位DP题 在这里感谢一下 Gatevin 学长的讲解帮我克服了对数位DP的畏惧

这题我的做法和前面我写的那篇 windy数  的题解的思路差不多的

先从最低位到最高位处理一下只有当前位(当前位之前假设都是前导0)有限定的时候的方案数

( f数组的四位分别是 当前位是哪一位 这一位是0还是1 现在的集合中有几个1 现在的集合中的数modx的值)

然后再从最高位到最低位扫一遍即可

#include <bits/stdc++.h>
using namespace std;
const int N=;
unsigned long long n;
int lim[N];
unsigned long long f[N][][N][N];
int top;
void prepare(int x)
{
memset(f,,sizeof(f));
f[][][][]=;
f[][][][%x]=;
for(int i=;i<top-;++i)
for(int j=;j<=x;++j)
for(int k=;k<x;++k)
{
f[i+][][j][k]+=f[i][][j][k];
f[i+][][j][k]+=f[i][][j][k];
f[i+][][j+][(k+(1ULL<<i+))%x]+=f[i][][j][k];
f[i+][][j+][(k+(1ULL<<i+))%x]+=f[i][][j][k];
}
}
unsigned long long check(int x)
{
unsigned long long re=;
int tmp=,cnt=;
for(int i=top-;i>=;--i)
if(lim[i])
{
if(x-cnt>=)
re+=f[i][][x-cnt][(x-tmp)%x];
tmp=((1ULL<<i)+tmp)%x;
++cnt;
}
return re+(cnt==x&&!tmp);
}
int main()
{
scanf("%llu",&n);
while(n)
{
lim[top++]=n&;
n>>=;
}
unsigned long long ans=;
for(int i=;i<=top;++i)
{
prepare(i);
ans+=check(i);
}
printf("%llu",ans);
return ;
}

codeforces gym100418J的更多相关文章

  1. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  2. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  3. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  4. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  5. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

  6. CodeForces - 274B Zero Tree

    http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...

  7. CodeForces - 261B Maxim and Restaurant

    http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...

  8. CodeForces - 696B Puzzles

    http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...

  9. CodeForces - 148D Bag of mice

    http://codeforces.com/problemset/problem/148/D 题目大意: 原来袋子里有w只白鼠和b只黑鼠 龙和王妃轮流从袋子里抓老鼠.谁先抓到白色老鼠谁就赢. 王妃每次 ...

随机推荐

  1. Java中的基本类型和包装类型区别

    首先看一下几个测试题,验证一下java中对基本类型和包装类型的理解,看看最后输出的答案对不对,答案在这篇博客中哦: // 第一题: 基本类型和包装类型 int a = 100; Integer b = ...

  2. JQ获取当前根目录

    function getRootPath_web() {            //获取当前网址,如: http://localhost:8083/uimcardprj/share/meun.jsp  ...

  3. 工作笔记:phpstrom、docker、phpunit进行单元测试

  4. [Linux] 004 安装

    1. 安装欢迎界面 Install or upgrade an existing system 安装或升级现有系统 Install system with basic video driver 安装过 ...

  5. c3p0连接池在spring中的配置

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destr ...

  6. php提交表单时如何保留多个空格及换行的文本样式

    需求是:用户提交表单时屏蔽敏感词的功能.其中敏感词来自服务器端同一路径下的ciku.txt,敏感词通过"|"连接,例如"g|c|a",提交表单时替换敏感词,更重 ...

  7. Pandas案例--人口密度分析

    需求: 导入文件,查看原始数据 将人口数据和各州简称数据进行合并 将合并的数据中重复的abbreviation列进行删除 查看存在缺失数据的列 找到有哪些state/region使得state的值为N ...

  8. hive Hsql

    show databases; use flume; show tables; desc flume; alter table table_name add columns(dt string); a ...

  9. IIS 应用池资源定时回收

    方法1: 方法2:

  10. JVM(4)之 使用MAT排查堆溢出

    开发十年,就只剩下这套架构体系了! >>>   接下来讲解如何设置以及当发生堆溢出的时候怎么排查问题.先看一小段代码:     代码中使用了一个无限循环来为list添加对象,如果采用 ...