bzoj 3209 bzoj1799 数位dp
3209: 花神的数论题
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 2267 Solved: 1040
[Submit][Status][Discuss]
Description
背景
众所周知,花神多年来凭借无边的神力狂虐各大 OJ、OI、CF、TC …… 当然也包括 CH 啦。
描述
话说花神这天又来讲课了。课后照例有超级难的神题啦…… 我等蒟蒻又遭殃了。
花神的题目是这样的
设 sum(i) 表示 i 的二进制表示中 1 的个数。给出一个正整数 N ,花神要问你
派(Sum(i)),也就是 sum(1)—sum(N) 的乘积。
Input
一个正整数 N。
Output
一个数,答案模 10000007 的值。
Sample Input
3
Sample Output
2
HINT
对于样例一,1*1*2=2;
数据范围与约定
对于 100% 的数据,N≤10^15
// 数位dp模板题 10^15最多52个1,枚举1的个数来统计就行了。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const ll mod=1e7+;
int bit[],maxv;
ll dp[][];
ll pow_mod(ll a,ll b)
{
if(b==) return ;
ll x=pow_mod(a,b/);
ll ans=x*x%mod;
if(b&) ans=ans*a%mod;
return ans;
}
ll dfs(int pos,int x,int limt)
{
if(pos<=) return x==maxv;
if(!limt&&dp[pos][x]!=-) return dp[pos][x];
ll ans=;
int maxb=(limt?bit[pos]:);
for(int i=;i<=maxb;i++){
ans+=dfs(pos-,x+i,limt&&(i==maxb));
}
if(!limt) dp[pos][x]=ans;
return ans;
}
void solve(ll n)
{
int nu=;
while(n){
bit[++nu]=(n&);
n>>=;
}
ll ans=;
for(int i=;i<=nu;i++){
memset(dp,-,sizeof(dp));
maxv=i;
ll tmp=dfs(nu,,);
ans=ans*pow_mod(i,tmp)%mod;
}
printf("%lld\n",ans);
}
int main()
{
ll n;
scanf("%lld",&n);
solve(n);
return ;
}
1799: [Ahoi2009]self 同类分布
Time Limit: 50 Sec Memory Limit: 64 MB
Submit: 1245 Solved: 535
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
Sample Output
HINT
【约束条件】1 ≤ a ≤ b ≤ 10^18
//数位dp模板题 10^18的数数位和最大是153,然后枚举数位和然后就行了。刚开始还傻到想要求前153个数的lcm。。。。
//dfs时记录余数pre 和数位和sum。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
ll dp[][][],po[];
int bit[];
ll dfs(int pos,int mod,int sum,int pre,bool w){
if(pos<=) return pre==&&sum==mod;
if(!w&&dp[pos][sum][pre]!=-) return dp[pos][sum][pre];
ll ans=;
int maxb=(w?bit[pos]:);
for(int i=;i<=maxb;i++){
ans+=dfs(pos-,mod,sum+i,(pre+i*po[pos])%mod,w&&(i==maxb));
}
if(!w) dp[pos][sum][pre]=ans;
return ans;
}
ll solve(ll x)
{
int nu=;
while(x){
bit[++nu]=x%;
x/=;
}
ll ans=;
for(int mod=;mod<=nu*;mod++){
memset(dp,-,sizeof(dp));
ans+=dfs(nu,mod,,,);
}
return ans;
}
int main()
{
po[]=;
for(int i=;i<=;i++) po[i]=po[i-]*1LL*;
ll a,b;
scanf("%lld%lld",&a,&b);
printf("%lld\n",solve(b)-solve(a-));
return ;
}
bzoj 3209 bzoj1799 数位dp的更多相关文章
- BZOJ 3329: Xorequ [数位DP 矩阵乘法]
3329: Xorequ 题意:\(\le n \le 10^18\)和\(\le 2^n\)中满足\(x\oplus 3x = 2x\)的解的个数,第二问模1e9+7 \(x\oplus 2x = ...
- BZOJ.3329.Xorequ(数位DP)
题目链接 x^3x=2x -> x^2x=3x 因为a^b+((a&b)<<1)=a+b,x^2x=x+2x,所以x和2x的二进制表示中不存在相邻的1. (或者,因为x+2x ...
- BZOJ 3329 - Xorequ - 数位DP, 矩乘
Solution 发现 $x \ xor \ 2x = 3x$ 仅当 $x$ 的二进制中没有相邻的 $1$ 对于第一个问题就可以进行数位DP 了. 但是对于第二个问题, 我们只能通过递推 打表 来算 ...
- BZOJ 3329 Xorequ (数位DP、矩阵乘法)
手动博客搬家: 本文发表于20181105 23:18:54, 原地址https://blog.csdn.net/suncongbo/article/details/83758728 题目链接 htt ...
- BZOJ 3329: Xorequ(数位dp+递推)
传送门 解题思路 可以把原式移项得\(x\)^\(2x\)=\(3x\),而\(x+2x=3x\),说明\(x\)二进制下不能有两个连续的\(1\).那么第一问就是一个简单的数位\(dp\),第二问考 ...
- BZOJ 3209: 花神的数论题 [数位DP]
3209: 花神的数论题 题意:求\(1到n\le 10^{15}\)二进制1的个数的乘积,取模1e7+7 二进制最多50位,我们统计每种1的个数的数的个数,快速幂再乘起来就行了 裸数位DP..\(f ...
- bzoj 3209 花神的数论题 —— 数位DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3209 算是挺简单的数位DP吧,但还是花了好久才弄明白... 又参考了博客:https://b ...
- bzoj 3209 花神的数论题——二进制下的数位dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3209 可以枚举 “1的个数是...的数有多少个” ,然后就是用组合数算在多少位里选几个1. ...
- BZOJ 3209 花神的数论题 数位DP+数论
题目大意:令Sum(i)为i在二进制下1的个数 求∏(1<=i<=n)Sum(i) 一道非常easy的数位DP 首先我们打表打出组合数 然后利用数位DP统计出二进制下1的个数为x的数的数量 ...
随机推荐
- Dev C++支持ISOC++11标准
报错如下: [Error] #error This file requires compiler and library support for the ISO C++ 2011 standard. ...
- 学习使用Git 版本控制 代码管理
title: 学习使用Git 版本控制 代码管理 notebook: 经验累积 tags:Git --- Git 版本控制 学习教程 Git版本控制器,可以作为程序员.计算机科学和软件工程的研究人员在 ...
- Mysql 表创建语句
# 新建bigData数据库 CREATE DATABASE bigData; USE bigData; # 创建dept表 CREATE TABLE dept( id INT UNSIGNED PR ...
- Sublime Text 2 - Unable to find git.exe 错误
今日打开 Sublime Text 2,随即弹出 Package Control - Unable to find git.exe 错误.如下, 原因:曾经通过 git clone 命令获取过 Sub ...
- Serverless 架构的优点和缺点
Serverless 的优势 在我使用 Serverless Framework 开发 AWS Serverless 应用的过程中,最方便的莫过于,第一次部署和第二次.第三次部署没有什么区别.只需要执 ...
- ORM(object relational Maping)
ORM即对象关系映射,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中.本质上 ...
- CS小分队第二阶段冲刺站立会议(5月28日)
昨日成果:昨天对我们的软件的主界面进行了思考,考虑到许多人建议我们团队添加可以自主增加软件快捷键的功能,我对这一想法的可行性和项目总体策划进行评估分析后,决定正式实施:已经完成从电脑上添加文件在我们的 ...
- Alpha-8
前言 失心疯病源8 团队代码管理github 站立会议 队名:PMS 530雨勤(组长) 今天完成了那些任务 20:00~23:00 代码整合,已形成可用模块,但还需适应场景局部优化 代码签入gith ...
- Scrum 项目准备4.0
4.0----------------------------------------------- 1.准备看板. 形式参考图4. 2.任务认领,并把认领人标注在看板上的任务标签上. 先由个人主动领 ...
- Java Map获取key和value 以及String字符串转List方法
一.问题描述 这里描述两个问题: 1.Java Map获取key和value的方法: 2.String字符串转List的方法: 二.解决方法 1.Java Map获取key和value的方法 2. ...