花神的数论题(这题...哎。数位dp咋就这么 not naive 呢)
题意简介
没什么好说,就是让你求出 1 ~ n 之间每个数转化为二进制后 '1' 的个数,然后乘起来输出积
题目分析
emmmm.... 两种解法(同是 $O(\log^2 N)$ 的算法,组合数效率完爆 数位dp,当然是我自己的数位dp)。
- 组合数直接艹。(数据范围8e9 能过,其实这个东西你搞一搞 __int128 什么的再找个大质数也许也能过去啦)(好吧这个直接暴力预处理组合数的数组就好了)
- 老老实实数位dp。(可以AC)
于是翻车了...这么久
算法实现
1. 组合数
组合数非常好做,只需要想想第 i 位为 1 的位上后面那一堆数字里面挑出 j 个数的方案就好了,注意加上 cnt ,然后最后快速幂累加一下答案,分分钟搞定
然后这里用了逆元处理组合数要预处理的阶乘,如果你还不会线性求逆元的话可以点这里
当然这里用逆元...就是作死...我们完全可以预处理出 50 * 50 的杨辉三角数组,存好组合数直接用
2.数位dp
...不就是枚举 1 的个数然后记忆化深搜么?hem...听起来完全没有组合数高级
代码实现
1.组合数
//by Judge
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
const int M=;
const ll mod=1e7+;
ll n,len,cnt,ans=;
ll C[M][M],d[M],num[M];
inline void prep(){ //预处理组合数模板?
for(int i=;i<=;++i) C[i][]=;
for(int i=,j;i<=;++i) for(j=;j<=;++j)
C[i][j]=C[i-][j]+C[i-][j-];
}
inline ll quick_pow(ll x,ll p,ll ans=){ //快速幂模板?
while(p){
if(p&) ans=ans*x%mod;
x=x*x%mod, p>>=;
} return ans;
}
signed main(){
cin>>n,prep();
while(n) d[++len]=n&,n>>=;//转化二进制
for(ll i=len,j;i;--i) if(d[i]){
for(j=;j<i;++j) //组合数就是随便乱艹的算法
num[cnt+j]+=C[i-][j];
++num[++cnt];
}
for(ll i=;i<=len;++i) //直接累乘就好
ans=ans*quick_pow(i,num[i])%mod;
cout<<ans<<endl; return ;
}
2.数位dp
//by Judge
#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
using namespace std;
const int M=;
const int mod=1e7+;
int cnt,x[M];
ll n,f[M][][M][M],num[M];
inline ll quick_pow(ll x,ll p,ll ans=){
while(p) (p&) && (ans=ans*x%mod),x=x*x%mod, p>>=;
return ans;
}
ll dp(int cur,int up,int tmp,int d){ //记忆化深搜,log^2 n 无压力
if(!cur) return tmp==d; //特判直接返回
if(~f[cur][up][tmp][d]) return f[cur][up][tmp][d]; // 已记忆,直接返回
int lim=up?x[cur]:;
ll res=;
for(int i=;i<=lim;++i) //继续深搜
res+=dp(cur-,up&&i==lim,tmp+(i==),d);
return f[cur][up][tmp][d]=res; //记忆化
}
ll solv(){
while(n) x[++cnt]=n&,n>>=; //同上转化
for(int i=;i<=;++i) //枚举要放入的 1 的位数
memset(f,-,sizeof(f)),
num[i]=dp(cnt,,,i);
ll res=;
for(int i=;i<=;++i) //累乘进答案
res=res*quick_pow(i,num[i])%mod;
return res;
}
signed main(){ cin>>n,cout<<solv()<<endl; return ; }
花神的数论题(这题...哎。数位dp咋就这么 not naive 呢)的更多相关文章
- bzoj 3209 花神的数论题——二进制下的数位dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3209 可以枚举 “1的个数是...的数有多少个” ,然后就是用组合数算在多少位里选几个1. ...
- 【洛谷】4317:花神的数论题【数位DP】
P4317 花神的数论题 题目背景 众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦. 题目描述 话说花神这天又来讲课了.课后照例有超级难的神题啦…… 我 ...
- 【BZOJ3209】花神的数论题 数位DP
[BZOJ3209]花神的数论题 Description 背景众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦.描述话说花神这天又来讲课了.课后照例有超级 ...
- [Bzoj3209]花神的数论题(数位dp)
3209: 花神的数论题 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2633 Solved: 1182[Submit][Status][Disc ...
- BZOJ_3209_花神的数论题_组合数+数位DP
BZOJ_3209_花神的数论题_组合数+数位DP Description 背景 众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦. 描述 话说花神这天又 ...
- [bzoj3209]花神的数论题_数位dp
花神的数论题 bzoj-3209 题目大意:sum(i)表示i的二进制表示中1的个数,求$\prod\limits_{i=1}^n sum(i)$ 注释:$1\le n\le 10^{15}$. 想法 ...
- BZOJ3209: 花神的数论题(数位DP)
题目: 3209: 花神的数论题 解析: 二进制的数位DP 因为\([1,n]\)中每一个数对应的二进制数是唯一的,我们枚举\(1\)的个数\(k\),计算有多少个数的二进制中有\(k\)个\(1\) ...
- BZOJ 3209: 花神的数论题 [数位DP]
3209: 花神的数论题 题意:求\(1到n\le 10^{15}\)二进制1的个数的乘积,取模1e7+7 二进制最多50位,我们统计每种1的个数的数的个数,快速幂再乘起来就行了 裸数位DP..\(f ...
- BZOJ3209 花神的数论题 【组合数学+数位DP+快速幂】*
BZOJ3209 花神的数论题 Description 背景 众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦. 描述 话说花神这天又来讲课了.课后照例有 ...
- 【数位DP】【P4317】花神的数论题
[数位DP][P4317]花神的数论题 Description 给定 \(n\),求 \(n\) 以内所有正整数二进制下 \(1\) 的个数的乘积,答案对 \(10^7 + 7\) 取模 Limita ...
随机推荐
- zk创建集群
在单机环境下和创建集群. 需要注意的点: 配置数据文件myid 1/2/3 对应server.1/2/3 通过./zkCli.sh -server [ip]:[port] 检测集群是否创建成功 在z ...
- stat/lstat函数使用
1. 进程虚拟地址空间 2. stat函数 获取文件信息 #include <sys/types.h> #include <sys/stat.h> #include <u ...
- 在py文件中设置文件头
在写python文件的时候有时需要记录作者.创建时间等时间,因此可以给python文件设置文件头,这里以PyCharm为例介绍设置步骤: 1. 打开PyCharm,依次点击Setting-----Ed ...
- consul - 基础
=============================consul 是什么============================= consul 是 HashiCorp 公司推出的开源工具, 该 ...
- XOR 加密
XOR 是一个神奇的运算符, 观察它的真值表, 很容易得到以下结论: 假设现有 a , b 变量, 则 a ^ 0 == a a ^ 0xff == ~a (取反加1等于作为补码的a的真值的相反数的补 ...
- SQL Server进阶(五)子查询
概述 子查询的概念: 当一个查询是另一个查询的条件时,称之为子查询.子查询可以嵌套在主查询中所有位置,包括SELECT.FROM.WHERE.GROUP BY.HAVING.ORDER BY. 外面的 ...
- Creating A Moddable Unity Game
前言: 对游戏进行修改与拓展(MOD)是我一直以来感兴趣的东西,我的程序生涯,也是因为在初中接触到GBA口袋妖怪改版开始的,改过也研究过一些游戏的MOD实现方式,早就想在自己的游戏中实现“MOD系统” ...
- 【杂】指针,*,&
一个小程序解释指针变量的作用: #include<iostream> #include"cww.h" void cloud(int *); using namespac ...
- 拦截对该服务器所有的http请求
一:拦截对该服务器所有的http请求. 在config 中加, <system.webServer> <modules> <add name="HttpAuth ...
- 练习:javascript弹出框及地址选择功能,可拖拽
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...