BZOJ3209: 花神的数论题(数位DP)
题目:
解析:
二进制的数位DP
因为\([1,n]\)中每一个数对应的二进制数是唯一的,我们枚举\(1\)的个数\(k\),计算有多少个数的二进制中有\(k\)个\(1\)
设\(n\)的二进制一共有\(num\)位,有\(sum[i]\)个数的二进制中有\(k\)个\(1\),
答案就是\(\prod_{i=1}^{num}i^{sum[i]}\)
用数位DP搞一下就好了
设\(f[i][j]\)表示到第\(i\)位有\(j\)个\(1\)时有多少个数
枚举\(k\),记搜一下。
由于可能会有很多数的二进制中有\(k\)个\(1\),所以用快速幂维护一下
相似思路的题还有1799: [Ahoi2009]self 同类分布
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 60;
const int mod = 10000007;
int n, m, num;
int digit[N], f[N][N];
int qpow(int a, int b) {
int ans = 1;
while (b) {
if (b & 1) ans = (ans * a) % mod;
b >>= 1, a = (a * a) % mod;
}
return ans % mod;
}
int dfs(int pos, int sum, int cnt, int limit) {
if (pos == -1) return sum == cnt;
if (cnt > sum) return 0;
if (!limit && ~f[pos][cnt]) return f[pos][cnt];
int up = limit ? digit[pos] : 1;
int ans = 0;
for (int i = 0; i <= up; ++i)
ans = ans + dfs(pos - 1, sum, cnt + i, limit && i == up);
if (!limit) f[pos][cnt] = ans;
return ans;
}
int divide(int x) {
int num = 0, ans = 1;
for ( ; x; x /= 2) digit[num++] = x % 2;
for (int i = 1; i <= num; ++i) {
memset(f, -1, sizeof f);
ans = (ans * qpow(i, dfs(num - 1, i, 0, 1))) % mod;
}
return ans % mod;
}
signed main() {
cin >> n;
cout << divide(n);
}
BZOJ3209: 花神的数论题(数位DP)的更多相关文章
- bzoj3209 花神的数论题——数位dp
题目大意: 花神的题目是这样的 设 sum(i) 表示 i 的二进制表示中 1 的个数.给出一个正整数 N ,花神要问你 派(Sum(i)),也就是 sum(1)—sum(N) 的乘积. 要对1000 ...
- [bzoj3209][花神的数论题] (数位dp+费马小定理)
Description 背景众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦.描述话说花神这天又来讲课了.课后照例有超级难的神题啦…… 我等蒟蒻又遭殃了. ...
- 【BZOJ3209】花神的数论题 数位DP
[BZOJ3209]花神的数论题 Description 背景众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦.描述话说花神这天又来讲课了.课后照例有超级 ...
- BZOJ 3209: 花神的数论题 [数位DP]
3209: 花神的数论题 题意:求\(1到n\le 10^{15}\)二进制1的个数的乘积,取模1e7+7 二进制最多50位,我们统计每种1的个数的数的个数,快速幂再乘起来就行了 裸数位DP..\(f ...
- BZOJ 3209 花神的数论题 数位DP+数论
题目大意:令Sum(i)为i在二进制下1的个数 求∏(1<=i<=n)Sum(i) 一道非常easy的数位DP 首先我们打表打出组合数 然后利用数位DP统计出二进制下1的个数为x的数的数量 ...
- bzoj 3209 花神的数论题 —— 数位DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3209 算是挺简单的数位DP吧,但还是花了好久才弄明白... 又参考了博客:https://b ...
- 洛谷$ P$4317 花神的数论题 数位$dp$
正解:数位$dp$ 解题报告: 传送门! 开始看到感觉有些新奇鸭,仔细一想发现还是个板子鸭,,, 考虑设$f_{i}$表示$sum[j]=i$的$j$的个数 日常考虑$dfs$呗,考虑变量要设哪些$Q ...
- 花神的数论题(数位dp)
规定sum[i] 为i里面含1的个数 ,求从1-N sum[i]的乘积. 数为64位内的,也就是sum[i]<=64的,这样可以dp求出1-N中含k个1的数有多少个,快速幂一下就可以了. 有个地 ...
- BZOJ3209 花神的数论题 【组合数学+数位DP+快速幂】*
BZOJ3209 花神的数论题 Description 背景 众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦. 描述 话说花神这天又来讲课了.课后照例有 ...
随机推荐
- PacMan 01——地图的搭建
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- GOJS的使用
项目当中要求表与表之间建立关联关系,需要用到Gojs(只想说这是个什么?),以前完全没接触过gojs,所以记录下使用中的技巧和方法 http://www.devtalking.com/articles ...
- mybatis 模糊查询 mapper.xml的写法
1. sql中字符串拼接 SELECT * FROM tableName WHERE name LIKE CONCAT(CONCAT('%', #{text}), '%'); 2. 使用 ${...} ...
- MyISAM引擎mysql5.6中大型网站数据库优化配置方案
硬件服务器:Dell R710,双至强E5620 CPU.16G内存.6*500G硬盘 操作系统:CentOS5.5 X86_64 系统 Mysql版本:MySQL 5.6 适用于:日IP ...
- python基础之四:list、tuple
一.列表 list # 列表 ''' 类似str,可以进行切片 ''' li = [', [1, 2, 3], 55, 'we all in ', 'Tom', ''] print(li[0:2]) ...
- 【Linux】查看程序是否正常运行
ps aux|grep redis-server ps -ef |grep redis netstat -tunple|grep 6379 netstat -lntp | grep 6379
- arduino控制超声波
//LingShun LAB #define Trig 2 //引脚Tring 连接 IO D2 #define Echo 3 //引脚Echo 连接 IO D3 float cm; //距离变量 f ...
- three.js 居中-模型
api: 代码: <!DOCTYPE html> <html lang="en"> <head> <title>three.js w ...
- three.js 基础使用1
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- Python——IO多路复用之select模块poll方法
Python——IO多路复用之select模块poll方法 使用poll方法实现IO多路复用 .├── poll_client.py├── poll_server.py└── settings.py ...