【数位DP】【P4317】花神的数论题

Description

给定 \(n\),求 \(n\) 以内所有正整数二进制下 \(1\) 的个数的乘积,答案对 \(10^7 + 7\) 取模

Limitations

\(1 \leq n \leq 10^{15}\)

Solution

这是我见过最简单的数位 DP,然而我还是翻车了……

考虑 \(1\) 最多有 \(O(\log n)\) 个,因此 \(1\) 的个数是可以枚举的。

枚举求有 \(k\) 个 \(1\) 的数的个数,设 \(f_{i, j}\) 是考虑前 \(i\) 位,剩下的位置还需要填 \(j\) 个 \(1\) 且不顶上界的方案数。转移显然:

\[f_{i,j} = f_{i-1,j+1} f_{i-1,j}
\]

分别对应第 \(i\) 位填 \(0\) 和填 \(1\)。

顶上界的情况记一下已经有几个 \(1\) 就可以更新了。

因为只考虑 \(1\) 的个数,所以前导 \(0\) 对答案没有贡献,不需要做特殊处理。

需要注意的是,\(10^7 + 7\) 并不是一个质数,\(10^7 + 7 ~=~941 \times 10627\),因此在 DP 的时候并不能模 \(p - 1\),因为他的欧拉函数并不是减一简单。事实上并不需要取模,因为方案数不会超过 \(n\),因此直接计算即可。

Code

#include <cstdio>
#include <cstring> const int maxn = 64;
const int MOD = 10000007; ll n;
int cnt, upc = -1;
ll ans = 1;
ll frog[maxn][maxn];
int MU[maxn]; ll calc(const int x);
ll mpow(const int x, ll y); int main() {
freopen("1.in", "r", stdin);
qr(n);
do cnt += (MU[++upc] = n & 1); while (n >>= 1);
for (int i = 1; i < 60; ++i) {
ans = ans * mpow(i, calc(i)) % MOD;
}
ans = ans * cnt % MOD;
qw(ans, '\n', true);
return 0;
} ll calc(const int x) {
int cnt = x - 1;
memset(frog, 0, sizeof frog);
frog[upc][x] = 1;
for (int i = upc - 1; ~i; --i) {
int di = i + 1;
for (int j = 0; j <= x; ++j) {
frog[i][j] = frog[di][j + 1] + frog[di][j];
}
if (MU[i] && ~cnt) {
++frog[i][cnt--];
}
}
return frog[0][0];
} ll mpow(const int x, ll y) {
ll _ret = 1, _tmp = x;
while (y) {
if (y & 1) {
_ret = _ret * _tmp % MOD;
}
_tmp = _tmp * _tmp % MOD;
y >>= 1;
}
return _ret;
}

Summary

神tm \(10^7+7\) 竟然不是个质数

【数位DP】【P4317】花神的数论题的更多相关文章

  1. P4317 花神的数论题 动态规划?数位DP

    思路:数位$DP$ 提交:5次(其实之前A过,但是调了调当初的程序.本次是2次AC的) 题解: 我们分别求出$sum(x)=i$,对于一个$i$,有几个$x$,然后我们就可以快速幂解决. 至于求个数用 ...

  2. P4317 花神的数论题 dp

    这题我一开始就想到数位dp了,其实好像也不是很难,但是自己写不出来...常规套路,f[i][j][k][t],从后往前填数,i位,j代表是否卡着上沿,k是现在有几个1,t是想要有几个.记忆化搜索就ok ...

  3. DP,数论————洛谷P4317 花神的数论题(求1~n二进制中1的个数和)

    玄学代码(是洛谷题解里的一位dalao小粉兔写的) //数位DP(二进制)计算出f[i]为恰好有i个的方案数. //答案为∏(i^f[i]),快速幂解决. #include<bits/stdc+ ...

  4. 洛谷 P4317 花神的数论题 || bzoj3209

    https://www.lydsy.com/JudgeOnline/problem.php?id=3209 https://www.luogu.org/problemnew/show/P4317 设c ...

  5. Luogu P4317 花神的数论题

    也是一道不错的数位DP,考虑先转成二进制后再做 转化一下问题,考虑统计出\([1,n]\)中在二进制下有\(i\)个\(1\)的方案数\(cnt_i\),那么答案显然就是\(\prod i^{cnt_ ...

  6. 洛谷P4317 花神的数论题

    洛谷题目链接 数位$dp$ 我们对$n$进行二进制拆分,于是就阔以像十进制一样数位$dp$了,基本就是套模板.. 接下来是美滋滋的代码时间~~~ #include<iostream> #i ...

  7. 洛谷 P4317 花神的数论题(组合数)

    题面 luogu 题解 组合数 枚举有多少个\(1\),求出有多少种数 扫描\(n\)的每一位\(1\), 强制选\(0\)然后组合数算一下有多少种方案 Code #include<bits/s ...

  8. P4317 花神的数论题

    题目 洛谷 数学方法学不会%>_<% 做法 爆搜二进制下存在\(i\)位\(1\)的情况,然后快速幂乘起来 My complete code #include<bits/stdc++ ...

  9. P4317 花神的数论题,关于luogu题解粉兔做法的理解

    link 题意 设 \(\text{sum}(i)\) 表示 \(i\) 的二进制表示中 \(1\) 的个数.给出一个正整数 \(N\) ,求 \(\prod_{i=1}^{N}\text{sum}( ...

  10. 【洛谷】4317:花神的数论题【数位DP】

    P4317 花神的数论题 题目背景 众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦. 题目描述 话说花神这天又来讲课了.课后照例有超级难的神题啦…… 我 ...

随机推荐

  1. Computing Science CMPT 361

    Computing Science CMPT 361 Fall 2019Assignment #3Due date: November 27th at 11:59 pm.Ray TracingYou ...

  2. pta作业错误点--总结

    pta作业错误点--总结 注释:在做pta题目的时候,发现有许多题目的错误点是值得归纳总结起来的,今后翻阅博客园的时候能够明白之前有哪些是可以值得复习的. 7-2 换硬币 习题2-3 求平方与倒数序列 ...

  3. [转帖]ASML EUV光刻机累计生产450万块晶圆:一台12亿元

    ASML EUV光刻机累计生产450万块晶圆:一台12亿元 来源驱动之家 ...网页被我关了 就这样吧. 截至目前,华为麒麟990 5G是唯一应用了EUV极紫外光刻的商用芯片,台积电7nm EUV工艺 ...

  4. Java学习:网络编程总结

    Java网络编程总结 一.概述 计算机网络是通过传输介质.通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共享和数据传输的系统.网络编程就就是编写程序使联网的两个(或多个)设备( ...

  5. 一段不错的代码JS的顶部轮播广告

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. 阿里OSS前端直传

    第一次写博客,如有错误请多多指教. 先上代码吧: ossUpload = function (file, fun, funParameter) { //第一此请求后台服务器获取认证请求 $.ajax( ...

  7. jq处理动画累加

    问题:日程提醒(跟日历一样的切换效果),只用一个div来展示当天日程数据,每次清空div里的数据再加载数据,导致切换日期时,数据展示div有闪动,于是采用动画来进行过渡,这样就巧妙地避免了闪动: $( ...

  8. vscode 代码折叠快捷键,折叠所有/展开所有

    1.折叠所有区域的快捷键:ctrl + k   ctrl + 0 (这里是数字键0) 2.展开所有区域的快捷键:ctrl + j    ctrl + j

  9. Bootstrap4后台导航栏制作

    <!Doctype html> <html lang="zh-cn"> <head> <!-- Required meta tags -- ...

  10. 微服务架构 ------ 插曲 hikari连接池的配置

    开胃菜:据说hikari连接池很快,快到让另一个连接池的作者抛弃对自己连接池的维护,并且强烈推荐使用hikari 连接池目前我们项目使用的有两个 一个是Druid , 一个是 Hikari, 其中Dr ...