也是一道不错的数位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 花神的数论题的更多相关文章

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

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

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

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

  3. BZOJ3209(luogu 4317)花神的数论题题解

    题目 设 sum(i) 表示 i 的二进制表示中 1 的个数.给出一个正整数 N ,花神要问你 派(Sum(i)),也就是 sum(1)—sum(N) 的乘积(n<=1e15). 分析 好吧,一 ...

  4. Luogu 4317 花神的数论题

    披着数论题外衣的数位dp. 相当于数一数$[1,n]$范围内$1$的个数是$1,2,3,4,...log(n)$的数各有多少个,直接在二进制下数位dp. 然而我比较sb地把(1e7 + 7)当成了质数 ...

  5. P4317 花神的数论题 dp

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

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

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

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

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

  8. P4317 花神的数论题

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

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

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

随机推荐

  1. iOS开发-本地存储(偏好设置,Plist,归档)

    1.   NSUserDefaults //TODO: 1.NSUserDefaults NSUserDefaults类除了可以存储数组.字典.NSdata外,还可以直接存储OC基本类型属性.但是不能 ...

  2. enum类使用

    状态常量类使用enum public class TestEnums{ public enum STATUS{ NOMAL("01","正常"), DELETE ...

  3. CENTOS7 SYSTEMD SERVICE 将自己的程序放入自动启动的系统服务

    1. 进入文件夹cd /usr/lib/systemd/system 2. 创建文件somed.service 3. 输入内容.如果是监控类程序,需要输入Type=forking[Unit]Descr ...

  4. Linux运维之每日小技巧-检测网站状态以及PV、UV等介绍

    [root@ELK-chaofeng07 httpd]# curl -o /dev/null -w %{http_code}\\n -s www.baidu.com 状态码为200表示成功. PV.U ...

  5. Centos7系统详细的启动流程

    熟悉系统启动流程对于我们学习Linux系统是非常有帮助的,虽然基础,但能帮助我们更加理解Linux系统的工作机制.以下将以CentOS发行版为例来介绍Linux系统的启动流程,因为在CentOS 5. ...

  6. 开启远程Windows系统3389端口

    1.Win7.Win2003.XP系统REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDen ...

  7. js对象属性与Bom

    1JavaScript 的对象 1.1字符串 1.2Array对象 1.3Date对象 1.4Math对象 1.5Function对象(重点) 2 Bom对象 1   JavaScript对象 在Ja ...

  8. (13)Python文件操作

  9. php 生成静态页面

    使用ob函数 <?php require_once(dirname(__FILE__).'/include/config.inc.php'); ?> <?php $dosql-> ...

  10. 树莓派开启SSH

    2017-04-10-raspbian-jessie默认SSH功能时关闭的 boot下新建一个ssh的空文件