题目

可能跟某位大佬有点类似,不过我的应该跑得比他快那么一点点......虽然应该没什么关系......


【分析】

假设一个对于一个数 \(N\) ,最高位为第 \(n\) 位

那么,显然有 \(2^n \leq N \leq 2^{n+1}-1\)

(即第一位一定为 \(1\) ,后面可能 \(1\) ,可能 \(0\))

因此,对于这个数 \(N\) ,我们不能直接拿 \(C_n^m\) 来算

那么我们可以这样考虑,最高位为 \(n\) ,那么,对于后面的 \((n-1)\) 为一定是可 \(1\) 可 \(0\) 。

因此,假设后面有 \(i\) 个 \(1\) ,故根据排列组合,有 \(C_{n-1}^i\) 个 \(i\),因此它对答案的贡献是 \(i^{C_{n-1}^i}\)

同理,类推出来,\(0\)~\(2^n-1\) 这些数对答案的贡献就是 \(\Pi_{i=1}^{n-1} i^{{C_{n-1}^i}}\)

那么我们现在将第 \(n\) 位固定为 \(1\) ,假设第二个 \(1\) 为第 \(m\) 位

同样的,它后面的 \((m-1)\) 为一定可 \(1\) 可 \(0\) ,因此同上考虑后 \((m-1)\) 位有 \(i\) 个 \(1\),加上前面那个 \(1\) 共\((i+1)\) 个 \(i\) ,故贡献为 \((i+1)^{C_{m-1}^i}\)

因此这个 \(1\) 对答案的贡献为 \(\Pi_{i=1}^{m-1} (i+1)^{C_{m-1}^i}\)

如上考虑,每个 \(1\) ,假设是第 \(Cnt\) 个 \(1\),在第 \(Cal\) 位,对答案的贡献就是 \(\Pi_{i=1}^{Cal-1} (i+Cnt)^{C_{Cal-1}^i}\)

把它们都乘起来即可

得到 \((N-1)\) 的答案(LRJ:想一想,为什么?)

所以直接读入的时候 \(N\) 给它 \(+1\) 即可

当然,这边还有一个问题(假装你们都懂得要取模和快速幂):

\(C_{n-1}^i\) 可能会极大无比

这边考虑欧拉公式:\(a^{\varphi(p)} \equiv 1(mod\) \(p)\)

且 \(\varphi(10000007)=9988440\)

因此,我们在算排列数的时候记得对这个数取模即可

剩下的一些细节就直接看本蒟蒻的代码吧


【代码】

那本蒟蒻就放代码了

#include<cstdio>
using namespace std;
#define f(a,b,c) for(register int a=b;a<=c;a++)
#define g(a,b,c) for(register int a=b;a>=c;a--)
#define Max(a,b) ((a>b)?a:b)
#define Min(a,b) ((a<b)?a:b)
#define File(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout)
typedef long long int ll;
typedef unsigned long long int ull;
const int MAXN=100010;
const int Mod=10000007;
const int Phi=9988440;
inline ll read(){
register ll ans=0;register char c=getchar();register bool neg=0;
while((c<'0')|(c>'9')) neg^=!(c^'-'),c=getchar();
while((c>='0')&(c<='9')) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return neg?-ans:ans;
}
ll N,Cnt=0,C[64][64],Ans=1;
int LOG(ll n){ return (n==1)?0:(LOG(n>>1)+1); }
void pre(){
N=read()+1;
int n=LOG(N);
f(i,0,n){
C[i][i]=C[i][0]=1;
g(j,i-1,1) C[i][j]=C[i-1][j]+C[i-1][j-1],C[i][j]-=(C[i][j]>=Phi)?Phi:0;
}
}
int pow(int i,int a){
if(a==0) return 1; if(a==1) return i;
ll tmp=pow(i,a>>1);
tmp=tmp*tmp%Mod*((a&1)?i:1)%Mod;
return tmp;
}
int main(){
pre();
while(N){
ll Cal=LOG(N);
if(Cnt) Ans*=Cnt,Ans%=Mod;
f(i,1,Cal) Ans*=pow(i+Cnt,C[Cal][i]),Ans%=Mod;
Cnt++;
N-=(1ll<<Cal);
}
printf("%d",Ans);
return 0;
}

最后安利一下 本蒟蒻的博客

题解 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. P4317 花神的数论题 dp

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

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

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

  5. Luogu P4317 花神的数论题

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

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

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

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

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

  8. P4317 花神的数论题

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

  9. 洛谷P4317 花神的数论题

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

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

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

随机推荐

  1. NPOI读取excel 空行

    if (sheet.GetRow(i) != null) 每行判断一下,避免出错.真是蛋疼.

  2. SPI协议解析

    1. SPI物理层 SPI通讯需要使用4条线:3条总线和1条片选 . SPI遵循主从模式,3条总线分别是SCK.MOSI和MISO,片选线为nSS(低电平有效),SPI协议适用于一主多从的工作场景: ...

  3. 前端学习(22)~css问题讲解

    你是如何理解 HTML 语义化的? 语义化:指对文本内容的结构化(内容语义化),选择合乎语义的标签(代码语义化). 举例:段落用 p,边栏用 aside,主要内容用 main 标签. 好处: 便于开发 ...

  4. Day 29:HTML常用标签

    软件的结构:  cs结构的软件的缺点:更新的时候需要用户下载更新包然后再安装,需要开发客户端与服务端.  cs结构软件的优点: 减轻服务端的压力,而且可以大量保存数据在客户端.  C/S(Client ...

  5. mybatis插入数据后将其ID返回

    背景 mybatis没有关联保存的功能,所以主从表需要分开保存,这就涉及到主表保存后要再次获取主表ID的环节,以下介绍mybatis插入数据后返回其自增ID的两种方式 方案 1.sql获取 <i ...

  6. 20200119日志 EPLAN高压房 VFD 单线图 心得

    提纲: EPLAN 画单线图的方法,可以先绘制原理图,然后在一个柜子里面的器件 用方框圈起来.方框名称一样.注意 一个工程里面的器件编号是唯一的. 断路器选型. PT 手车 接地刀作用     具体内 ...

  7. windows中的运行命令

    首先按“开始”-“运行”,或按WIN键+R,进入『运行』窗口. 下面是常用的运行命令 (按英文字符顺序排列) appwize.cpl----添加.删除程序 access.cpl-----辅助功能选项 ...

  8. Python基础笔记:高级特性:切片、迭代、列表生成式、生成器、迭代器

    题记: 在python中,代码不是越多越好,而是越少越好.代码不是越复杂越好,而是越简单越好. 1行代码能实现的功能,绝不写5行代码. 请始终牢记:代码越少,开发效率越高. 切片 >>&g ...

  9. delphi dll编写与调用

    dll代码: mydll.dpr library mydll; uses System.SysUtils, System.Classes, uFunction in 'uFunction.pas'; ...

  10. Flink 容错机制与状态

    简介 Apache Flink提供了一种容错机制,可以持续恢复数据流应用程序的状态. 该机制确保即使出现故障,经过恢复,程序的状态也会回到以前的状态. Flink 主持 at least once 语 ...