luogu_4317: 花神的数论题
花神的数论题
题意描述:
- 设\(sum(i)\)表示\(i\)的二进制数中\(1\)的个数。
- 给定一个整数\(N\),求\(\prod_{i=1}^Nsum(i)\)。
输入描述:
- 输入包含一个正整数\(N(N\leq10^{15})\)。
输出描述:
- 一个数,答案模\(10000007\)的值。
解题思路:
- 数位\(dp\)+快速幂。
- 令\(f(i,j,k)\)表示以\(k\)开头的\(i\)位数中\(1\)的个数为\(j\)的数量。有转移方程
- \(f(i,j,0)=f(i-1,j,0)+f(i-1,j,1)\)
- \(f(i,j,1)=f(i-1,j-1,0)+f(i-1,j-1,1)\)
- 这个很好理解,就是往最高位填\(0/1\)。
- 设\(sum(i)==x\)的\(i\)有\(tot\)个,那么他对答案的贡献显然就是\(x^{tot}\)。
- 所以这时候枚举\(x\)就行,显然对于\(N(N\leq 10^{15})\)而言,不会枚举超过\(60\)次。
- 详见代码:
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 70, mod = 10000007;
ll f[maxn][maxn][2];
ll n, ans;
inline ll qmi(ll a, ll b)
{
ll res = 1;
while(b)
{
if(b & 1) res = (res * a) % mod;
a = (a * a) % mod;
b >>= 1ll;
} return res % mod;
}
//x对应的二进制中有多少个1
inline ll len(ll x)
{
ll res = 0;
while(x)
{
if(x & 1ll) res++;
x >>= 1ll;
}
return res;
}
int num[maxn], cnt;
inline void work(ll x)
{
cnt = 0; ans = 1;
while(x) //分解数位
{
num[++cnt] = x&1;
x >>= 1;
}
//枚举m, 求出有多少i,有sum(i)=m
for(int m = 1; m <= cnt; m++)
{
for(int i = 1; i < cnt; i++)
ans = (ans * qmi(m, f[i][m][1]) % mod) % mod;
//先枚举位数比n要小的数
//开始处理位数和n相同的数字
int k = m;
//如果n的最高位是1的话
//其实相当于把最高位固定了
if(num[cnt]) k--;
//从高位往低位枚举
//之后我们让第i位小于n的第i位
//这样可以让第i位后面的数字随便填写
for(int i = cnt - 1; i >= 1; i--)
{
for(int j = 0; j < num[i]; j++)
ans = (ans * qmi(m, f[i][k][j]) % mod) % mod;
if(num[i]) k--; //相当于把第i位固定 因为i有1 所以k--
if(k < 0) break;
}
}
//由于一直卡上界,所以其实一直没有遇到等于n的情况
//所以最后对n暴力分解数位处理一下
ans = ((ans % mod) * (len(n) % mod)) % mod;
printf("%lld\n", ans);
}
inline void init()
{
scanf("%lld", &n);
//dp预处理
f[1][0][0] = f[1][1][1] = 1;
for(int i = 1; i <= 60; i++)
{
for(int j = 0; j <= i; j++)
{
f[i+1][j+1][1] += f[i][j][0] + f[i][j][1];
f[i+1][j][0] += f[i][j][0] + f[i][j][1];
}
} work(n);
}
int main()
{
init();
return 0;
}
luogu_4317: 花神的数论题的更多相关文章
- BZOJ 3209: 花神的数论题 [数位DP]
3209: 花神的数论题 题意:求\(1到n\le 10^{15}\)二进制1的个数的乘积,取模1e7+7 二进制最多50位,我们统计每种1的个数的数的个数,快速幂再乘起来就行了 裸数位DP..\(f ...
- 【洛谷】4317:花神的数论题【数位DP】
P4317 花神的数论题 题目背景 众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦. 题目描述 话说花神这天又来讲课了.课后照例有超级难的神题啦…… 我 ...
- 【LG4317】花神的数论题
[LG4317]花神的数论题 题面 洛谷 题解 设\(f_{i,up,tmp,d}\)表示当前在第\(i\)位,是否卡上界,有\(tmp\)个一,目标是几个一的方案数 最后将所有\(d\)固定,套数位 ...
- BZOJ3209 花神的数论题 【组合数学+数位DP+快速幂】*
BZOJ3209 花神的数论题 Description 背景 众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦. 描述 话说花神这天又来讲课了.课后照例有 ...
- [BZOJ3209]花神的数论题 组合数+快速幂
3209: 花神的数论题 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2498 Solved: 1129[Submit][Status][Disc ...
- 【BZOJ3209】花神的数论题 数位DP
[BZOJ3209]花神的数论题 Description 背景众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦.描述话说花神这天又来讲课了.课后照例有超级 ...
- 【bzoj3209】: 花神的数论题 数论-DP
[bzoj3209]: 花神的数论题 首先二进制数中1的个数最多就是64个 设所有<=n的数里二进制中1的个数为i的有a[i]个 那么答案就是 然后快速幂 求a[i]可以用DP 设在二进制中从 ...
- bzoj3209:3209: 花神的数论题
觉得还是数位dp的那种解题形式但是没有认真的想,一下子就看题解.其实还是设置状态转移.一定要多思考啊f[i][j]=f[i-1][j]+g[i-1][j] g[i][j]=f[i-1][j-1]+g[ ...
- [Bzoj3209]花神的数论题(数位dp)
3209: 花神的数论题 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2633 Solved: 1182[Submit][Status][Disc ...
随机推荐
- 可落地的DDD(3)-如何利用DDD进行微服务的划分
摘要 前面两篇介绍了DDD的目标管理.DDD的工程结构调整.这篇讨论微服务的划分.微服务是目前后端比较流行的架构体系了,那么如何做好一个微服务的划分?一个微服务的粒度应该是多大呢?这篇主要介绍如何结合 ...
- latex在vim中的代码片段
Gilles Castel写的vim中使用的代码片段,质量很高,原文:https://github.com/gillescastel 下载后,存放到 ~/.vim/plugged/ultisnips/ ...
- 浅谈 G1 GC 日志格式
在 Java9 中,G1 GC 将成为默认的垃圾收集器,G1 垃圾收集器的关键特性之一是能够在不牺牲吞吐量的同时,限制 GC 暂停时间(即可以设置所需的最大停顿时间). 由于 G1 GC 正在逐渐成为 ...
- 立个铁矿石的flag,从7月初开始,铁矿石的库存,可能要进入累库存阶段了.
从发货量倒推出的到货量,用来评估未来的到货量 推测的到港量与实际北方6港到港量的关系 通过月度到港量,估计出北方6港对全国到港量的正确性. 悲观的库存预期 乐观的库存预期 大概率的情况吧
- 一次golang应用的docker部署经历
开发平台win10,服务器centos7.5 编写dockerfile # scratch 为空镜像,因为golang的build的可执行文件不需要什么环境 FROM scratch # 作者署名 M ...
- Elasticsearch 、 Logstash以及Kibana 分布式日志
搭建ELK日志分析平台(上)—— ELK介绍及搭建 Elasticsearch 分布式集群 ELK简介: ELK是三个开源软件的缩写,分别为:Elasticsearch . Logstash以及Kib ...
- ReactiveObjC basic
基础-> https://www.jianshu.com/p/cd4031fbf8ff 在RAC中,万物皆信号. RAC 指的就是 RactiveCocoa ,是 Github 的一个开源框架, ...
- Beego学习笔记6:分页的实现
实现分页的效果 1> 分页的实现的业务逻辑 1->每个页面显示N条数据,总的数据记录数M,则分页的个数为M%N==0?M/N:M/N+1; 2->页面渲染分页的html部分 ...
- Spring boot应用如何支持https
首先使用命令行生成一个keystore文件: keytool -genkey -alias tomcat -keyalg RSA -keystore ./jerry.keystore 保存到本地项目文 ...
- 干货分享 | 3个开发IoT项目的开源物联网平台
物联网(IoT)是帮助人工智能(AI)以更好的方式控制和理解事物的未来技术. 艾艺收集了一些最有名的物联网平台,帮助您以受控方式开发物联网项目.物联网平台是帮助设置和管理互联网连接设备的组件套件. 一 ...