Luogu P4317 花神的数论题
也是一道不错的数位DP,考虑先转成二进制后再做
转化一下问题,考虑统计出\([1,n]\)中在二进制下有\(i\)个\(1\)的方案数\(cnt_i\),那么答案显然就是\(\prod i^{cnt_i}\)
然后我们还是先预处理一个东西\(s_{i,j}\),表示在二进制下前\(i\)位中填上\(j\)个\(1\)的方案数,则有转移:
\(s_{i,j}=s_{i-1,j}+s_{i-1,j-1}(i>1)\),同时有\(s_{i,0}=1\)
这转移很简单吧,就是考虑这一位填上\(0/1\)
观察一下发现其实这就是个杨辉三角,不过好像并没有什么用。
接下来枚举有\(i\)个\(1\)的情况,那么从高位填到低位,对于每一位上的\(1\),我后面怎么填都是满足要求的
因此此时的\(cnt_i+=s_{l,k}\),\(l\)表示后面还有多少位(比它低的位),\(k\)表示之前(包括现在)已经出现多少个\(1\),最后直接快速幂计算一下就好了。
注意到这样只能处理小于\(n\)的数的情况(一般很多二进制下的数位DP都有这个通病),所以我们直接把\(n\)加一即可。
CODE
#include<cstdio>
using namespace std;
const long long N=65,mod=10000007;
long long n,s[N][N],ans=1LL,cnt,bit[N];
inline void resolve(long long x)
{
while (x) bit[++cnt]=x&1,x>>=1;
}
inline long long solve(long long x)
{
register long long i; long long tot=0;
for (i=cnt;i>=1&&~x;--i)
if (bit[i]) tot+=s[i-1][x--];
return tot;
}
inline long long quick_pow(long long x,long long p)
{
long long tot=1;
while (p)
{
if (p&1) tot=tot*x%mod;
x=x*x%mod; p>>=1;
}
return tot;
}
int main()
{
register long long i,j; scanf("%lld",&n); resolve(++n);
for (s[0][0]=1,i=1;i<=cnt;++i)
for (j=0;j<=i;++j)
s[i][j]=j?s[i-1][j]+s[i-1][j-1]:s[i-1][j];
for (i=1;i<=cnt;++i)
ans=ans*quick_pow(i,solve(i))%mod;
return printf("%lld",ans),0;
}
Luogu P4317 花神的数论题的更多相关文章
- P4317 花神的数论题,关于luogu题解粉兔做法的理解
link 题意 设 \(\text{sum}(i)\) 表示 \(i\) 的二进制表示中 \(1\) 的个数.给出一个正整数 \(N\) ,求 \(\prod_{i=1}^{N}\text{sum}( ...
- 洛谷 P4317 花神的数论题 || bzoj3209
https://www.lydsy.com/JudgeOnline/problem.php?id=3209 https://www.luogu.org/problemnew/show/P4317 设c ...
- BZOJ3209(luogu 4317)花神的数论题题解
题目 设 sum(i) 表示 i 的二进制表示中 1 的个数.给出一个正整数 N ,花神要问你 派(Sum(i)),也就是 sum(1)—sum(N) 的乘积(n<=1e15). 分析 好吧,一 ...
- Luogu 4317 花神的数论题
披着数论题外衣的数位dp. 相当于数一数$[1,n]$范围内$1$的个数是$1,2,3,4,...log(n)$的数各有多少个,直接在二进制下数位dp. 然而我比较sb地把(1e7 + 7)当成了质数 ...
- P4317 花神的数论题 dp
这题我一开始就想到数位dp了,其实好像也不是很难,但是自己写不出来...常规套路,f[i][j][k][t],从后往前填数,i位,j代表是否卡着上沿,k是现在有几个1,t是想要有几个.记忆化搜索就ok ...
- 洛谷 P4317 花神的数论题(组合数)
题面 luogu 题解 组合数 枚举有多少个\(1\),求出有多少种数 扫描\(n\)的每一位\(1\), 强制选\(0\)然后组合数算一下有多少种方案 Code #include<bits/s ...
- DP,数论————洛谷P4317 花神的数论题(求1~n二进制中1的个数和)
玄学代码(是洛谷题解里的一位dalao小粉兔写的) //数位DP(二进制)计算出f[i]为恰好有i个的方案数. //答案为∏(i^f[i]),快速幂解决. #include<bits/stdc+ ...
- P4317 花神的数论题
题目 洛谷 数学方法学不会%>_<% 做法 爆搜二进制下存在\(i\)位\(1\)的情况,然后快速幂乘起来 My complete code #include<bits/stdc++ ...
- P4317 花神的数论题 动态规划?数位DP
思路:数位$DP$ 提交:5次(其实之前A过,但是调了调当初的程序.本次是2次AC的) 题解: 我们分别求出$sum(x)=i$,对于一个$i$,有几个$x$,然后我们就可以快速幂解决. 至于求个数用 ...
随机推荐
- Python 关于Python函数参数传递方式的一点探索
关于Python函数参数传递方式的一点探索 by:授客 QQ:1033553122 实践代码 #!/usr/bin/env python # -*- coding:utf-8 -*- __author ...
- ADB命令行控制界面开关
以下命令需要root权限: svc命令 这个脚本在/system/bin目录下,这个命令可以用来控制电源管理,wifi开关,数据开关(就是上网流量) svc power stayon [t ...
- IDEA错误:Failed to start end point associated with ProtocolHandler [http-nio-9999] java.net.BindException: Address already in use: bind
日志显示进程端口已被占用,首先需要的是查询什么进程占用了当前的9999端口. 1.win+R输入cmd进入命令界面: 2.输入命令 netstat -ano|findstr "端口号&qu ...
- maven管理项目的特点
Maven介绍 我们在开发项目的过程中,会使用一些开源框架.第三方的工具等等,这些都是以jar包的方式被项目所引用,并且有些jar包还会依赖其他的jar包,我们同样需要添加到项目中,所有这些相关的ja ...
- LeetCode题解之 Find Mode in Binary Search Tree
1.题目描述 2.问题分析 使用map记录元素出现的次数. 3.代码 vector<int> v; map<int,int> m; vector<int> find ...
- 洗礼灵魂,修炼python(24)--自定义函数(5)—匿名函数lambda
在这个互联网时代,大家都喜欢匿名,匿名上网,匿名登录,匿名操作等等,都不喜欢实名对吧?(虽然说现在实名制已经快到来,题外话,扯远了),当然python里也有个不喜欢实名的,它的功效优点特殊,说强大吧? ...
- FastReport脚本把数据绑定到文本控件上
public class ReportScript { private void Data25_BeforePrint(object sender, EventArgs e)//Data25是指需要绑 ...
- nginx服务器开启缓存、反向代理
一.反向代理配置 1.反向代理服务器配置如下 反向代理就是需要这一行proxy_pass来完成.当我们要访问后端web服务器的时候,我们只需要访问代理服务器就可以了,此时代理服务器就充当后端web服务 ...
- input 属性radio中设置checked 不生效
同一个页面中有许多地方都用到了单选按钮并设置了默认选中 , 结果在运行的时候发现单选按钮没有被默认选中 由于是复制然后修改个别属性 ,然后直接使用的 , 所以name值忘记修改了 , 单选框是根据na ...
- Alpha冲刺! Day10 - 砍柴
Alpha冲刺! Day10 - 砍柴 今日已完成 晨瑶:处理一些杂碎: 反思. 昭锡:主页添加时间选择器,实现随机分布的光点与数据绑定. 永盛:定下来了 MVC 的许多东西,完成 Router 的样 ...