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

玄学代码(是洛谷题解里的一位dalao小粉兔写的)
//数位DP(二进制)计算出f[i]为恰好有i个的方案数。
//答案为∏(i^f[i]),快速幂解决。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mod=;
ll n,ans=;
ll c,f[];
ll qpow(ll b,ll e){
ll a=;
for(;e;b=b*b%mod,e>>=)
e&?a=a*b%mod:;
return a;
} int main(){
scanf("%lld",&n);
for(int j=;~j;--j){
for(int i=;i;--i)
f[i]+=f[i-];
if(n>>j&)++f[c++];
}++f[c];
for(int i=;i<=;++i)
ans=ans*qpow(i,f[i])%mod;
printf("%lld",ans);
return ;
}
下面是另一位dalaoStyx写的简单易懂的题解



代码如下
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define mod 10000007
using namespace std; long long ans=,n,k,cnt,dp[][]; long long kasumi(long long a,long long b)
{
long long tmp=;
while(b)
{
if(b&) tmp=(tmp%mod)*a%mod;
a=(a%mod)*a%mod;
b>>=;
}
return tmp%mod;
} int main()
{
scanf("%lld",&n);
for(int i=; i<=; i++)
{
dp[i][]=;
}
for(int i=; i<=; i++)
{
dp[i][i]=;
}
for(int i=; i<=; i++)
{
for(int j=; j<i; j++)
{
dp[i][j]=dp[i-][j-]+dp[i-][j];
}
}
for(k=; k<=n; k<<=)
{
n-=k;
cnt++;
for(int j=; j<=cnt; j++)
{
ans=(ans%mod)*kasumi(j,dp[cnt][j])%mod;
ans%=mod;
}
}
cnt=;
for(int i=;i>=;i--)
{
if((1ll<<i)<=n)
{
for(int j=;j<=i+;j++)
{
ans=(ans%mod)*kasumi(j+cnt,dp[i+][j]);
ans%=mod;
}
cnt++;
n-=(1ll<<i);
}
}
printf("%lld\n",ans);
}
至于为什么不用扩展欧拉定理降幂,那是因为杨辉三角在总和等于1e15的时候 ,每一个数肯定不会爆longlong
DP,数论————洛谷P4317 花神的数论题(求1~n二进制中1的个数和)的更多相关文章
- 洛谷P4317 花神的数论题
洛谷题目链接 数位$dp$ 我们对$n$进行二进制拆分,于是就阔以像十进制一样数位$dp$了,基本就是套模板.. 接下来是美滋滋的代码时间~~~ #include<iostream> #i ...
- 洛谷 P4317 花神的数论题 || bzoj3209
https://www.lydsy.com/JudgeOnline/problem.php?id=3209 https://www.luogu.org/problemnew/show/P4317 设c ...
- 洛谷 P4317 花神的数论题(组合数)
题面 luogu 题解 组合数 枚举有多少个\(1\),求出有多少种数 扫描\(n\)的每一位\(1\), 强制选\(0\)然后组合数算一下有多少种方案 Code #include<bits/s ...
- P4317 花神的数论题
题目 洛谷 数学方法学不会%>_<% 做法 爆搜二进制下存在\(i\)位\(1\)的情况,然后快速幂乘起来 My complete code #include<bits/stdc++ ...
- P4317 花神的数论题 dp
这题我一开始就想到数位dp了,其实好像也不是很难,但是自己写不出来...常规套路,f[i][j][k][t],从后往前填数,i位,j代表是否卡着上沿,k是现在有几个1,t是想要有几个.记忆化搜索就ok ...
- 棋盘DP三连——洛谷 P1004 方格取数 &&洛谷 P1006 传纸条 &&Codevs 2853 方格游戏
P1004 方格取数 题目描述 设有N $\times N$N×N的方格图(N $\le 9$)(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字00.如下图所示(见样例): A ...
- P4317 花神的数论题 动态规划?数位DP
思路:数位$DP$ 提交:5次(其实之前A过,但是调了调当初的程序.本次是2次AC的) 题解: 我们分别求出$sum(x)=i$,对于一个$i$,有几个$x$,然后我们就可以快速幂解决. 至于求个数用 ...
- Luogu P4317 花神的数论题
也是一道不错的数位DP,考虑先转成二进制后再做 转化一下问题,考虑统计出\([1,n]\)中在二进制下有\(i\)个\(1\)的方案数\(cnt_i\),那么答案显然就是\(\prod i^{cnt_ ...
- P4317 花神的数论题,关于luogu题解粉兔做法的理解
link 题意 设 \(\text{sum}(i)\) 表示 \(i\) 的二进制表示中 \(1\) 的个数.给出一个正整数 \(N\) ,求 \(\prod_{i=1}^{N}\text{sum}( ...
随机推荐
- 莫比乌斯函数介绍&&基础
定义 设正整数$N$按照算术基本定理分解质因数为$N=p_1^{c_1}p_2^{c_2} \cdots P_m^{c_m}$,定义函数: $$\mu(N)= \left\{\begin{matrix ...
- PHP mysqli_more_results() 函数
定义和用法 mysqli_more_results() 函数检查一个多查询是否有更多的结果. 语法 mysqli_more_results(connection); 参数 描述 connection ...
- 【csp模拟赛2】 爆搜 方格加数
[题目描述] xyz1048576正在玩一个关于矩阵的游戏. 一个n*m的矩阵,矩阵中每个数都是[1,12]内的整数.你可以执行下列两个操作任意多次: (1)指定一行,将该行所有数字+1. (2)指定 ...
- Django Admin中增加导出CSV功能
参考: https://books.agiliq.com/projects/django-admin-cookbook/en/latest/export.html 在使用Django Admin时, ...
- ie8中使用ajax总是进入error解决办法
试过很多种方法有的说是因为要把cache:false,但是本人遇到的情况可能不同最终结局的办法是 引用的是<script src="js/jquery-1.4.2.min.js&quo ...
- jquery ajax缓存问题解决方法小结
今天在做一个ajax数据提交功能开始利用get方式一直发现提交的数据都是一样,返回的数据也很久不刷新了,这个我知道是ajax缓存问题,后来在网上整理了一些ajax缓存问题解决方法,下面给大家分享一下. ...
- php反序列化笔记
普通的魔法方法 public,private,protected属性序列化后的不同 绕过wakeup session反序列化 phar反序列化 1.普通的魔法方法 __construct() 创建一个 ...
- ubuntu 14.04 升级到18.04
http://www.360doc.com/content/18/0929/09/35082563_790606785.shtml
- QT 多线程程序设计 -互斥
QT通过三种形式提供了对线程的支持.它们分别是,一.平台无关的线程类,二.线程安全的事件投递,三.跨线程的信号-槽连接.这使得开发轻巧的多线程Qt程序更为容易,并能充分利用多处理器机器的优势.多线程编 ...
- EBS登录问题小结
1 网络问题 1)ping IP 2)telnet IP 端口 备注:如果端口能访问则直接跳转,如果不能访问则报错如下所示: 2)配置host文件 如果访问的服务器在内网,则需要配置host信息 3) ...