codeforces gym100418J
题目简述
给定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的更多相关文章
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
- CodeForces - 261B Maxim and Restaurant
http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...
- CodeForces - 696B Puzzles
http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...
- CodeForces - 148D Bag of mice
http://codeforces.com/problemset/problem/148/D 题目大意: 原来袋子里有w只白鼠和b只黑鼠 龙和王妃轮流从袋子里抓老鼠.谁先抓到白色老鼠谁就赢. 王妃每次 ...
随机推荐
- 什么是HTTP协议?常用的状态码有哪些?
一.HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的 ...
- 巧用css内容生成
1. .box:before{content:"生成内容";}在.box内部的内容之前加上生成内容 2. .box:after{content:"生 ...
- BZOJ 1912(树的直径+LCA)
题面 传送门 分析 显然,如果不加边,每条边都要走2次,总答案为2(n-1) 考虑k=1的朴素情况: 加一条边(a,b),这条边和树上a->b的路径形成一个环,这个环上的边只需要走一遍,所以答案 ...
- poj2385 Apple Catching (线性dp)
题目传送门 Apple Catching Apple Catching Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 154 ...
- Mint-Linux【最佳】【快速】安装微信、企业微信、TIM、QQ等软件
废话不多说 直接上教程 注意看 方式一.在线安装 在本地目录下.如 /home/root/Document 直接使用在线安装脚本,安装最新的Release版本: wget -qO- https://r ...
- C# 字符串的拆分
string str = "ABCD"; char[] strCharArr = str.ToCharArray(); //结果 //strCharArr[0]='A', //st ...
- shell脚本-巡检内存使用率
#!/bin/bash # by dreamer Q # 巡检内存脚本 #总内存大小 mem_total=`free -m | sed -n '2p' |awk '{print $2}'` #已使用内 ...
- Electron 无边框窗口最大化最小化关闭功能
Electron 无边框窗口最大化最小化关闭功能 目的 实现无边框窗口,并添加最大化最小化和关闭功能 前提 了解Electron 主进程和渲染进程的通讯 了解 BrowserWindow相关功能 操作 ...
- css文本内容大于内本显示框设置其显示方式
1. <style type="text/css"> .text-ellipsis{ overflow: hidden;//隐藏滚动条 white-space: now ...
- rpc - rpc 程序号数据库
SYNOPSIS /etc/rpc DESCRIPTION rpc 文件列出了rpc 程序的可读名, 可以此代替rpc 程序号. 每行包含如下信息: 运行rpc 程序的服务名 rpc 程序号 别名 各 ...