首先这道题目不难想到将答案转化为这种形式

2^s[2]*3*s[3]*…max*s[max]

这时候我们要分类讨论,设n的二进制位数为t

当1~n中二进制位数小于t时

我们可以直接用组合的知识,二进制有i个1一共有c(t-1,i)

当1~n中二进制位数等于t时

我们数位统计一下即可,具体的当第i位为1时,(从右往左标)

后面i-1位01情况随意,即s[j+s]=s[j+s]+c(i-1,j) (s为到第i位n所含1的个数(不包括第i位),0<=j<=i-1)

当第i位为0,不管他……

最后用一下快速幂即可

 const mo=;

 var c:array[..,..] of int64;
    sum:array[..] of int64;
    b:array[..] of int64;
    i,j:longint;
    n,s,p,t,ans:int64; function quick(x,y:int64):int64;
  var i:longint;
      m:int64;   begin
    m:=;
    while x<> do
    begin
      inc(m);
      b[m]:=x mod ;
      x:=x div ;
    end;
    quick:=y;
    for i:=m- downto do
    begin
      quick:=quick*quick mod mo;
      if b[i]= then quick:=quick*y mod mo;
    end;
  end; begin
  c[,]:=;
  for i:= to do
  begin
    c[i,]:=;
    c[i,i]:=;
    for j:= to i- do
      c[i,j]:=c[i-,j]+c[i-,j-];
  end;
  readln(n);
  t:=trunc(ln(n)/ln())+;
  for i:= to t- do
    sum[i]:=c[t-,i];
  t:=;
  while n<> do
  begin
    inc(t);
    b[t]:=n mod ;
    n:=n div ;
  end;
  s:=;
  for i:=t- downto do
    if b[i]= then
    begin
      for j:= to i- do
        sum[j+s]:=sum[j+s]+c[i-,j];
      s:=s+;
    end;   sum[s]:=sum[s]+; //还有n这个数要统计
  ans:=;
  for i:= to t do
    if sum[i]<> then
      ans:=ans*quick(sum[i],i) mod mo;
  writeln(ans);
end.

bzoj3209的更多相关文章

  1. BZOJ3209 花神的数论题 【组合数学+数位DP+快速幂】*

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

  2. 【BZOJ3209】花神的数论题 数位DP

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

  3. 【bzoj3209】: 花神的数论题 数论-DP

    [bzoj3209]: 花神的数论题 首先二进制数中1的个数最多就是64个 设所有<=n的数里二进制中1的个数为i的有a[i]个 那么答案就是  然后快速幂 求a[i]可以用DP 设在二进制中从 ...

  4. [bzoj3209]花神的数论题_数位dp

    花神的数论题 bzoj-3209 题目大意:sum(i)表示i的二进制表示中1的个数,求$\prod\limits_{i=1}^n sum(i)$ 注释:$1\le n\le 10^{15}$. 想法 ...

  5. BZOJ3209 花神的数论题

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  6. bzoj3209 花神的数论题 (二进制数位dp)

    二进制数位dp,就是把原本的数字转化成二进制而以,原来是10进制,现在是二进制来做,没有想像的那么难 不知到自己怎么相出来的...感觉,如果没有一个明确的思路,就算做出来了,也并不能锻炼自己的能力,因 ...

  7. bzoj3209 花神的数论题——数位dp

    题目大意: 花神的题目是这样的 设 sum(i) 表示 i 的二进制表示中 1 的个数.给出一个正整数 N ,花神要问你 派(Sum(i)),也就是 sum(1)—sum(N) 的乘积. 要对1000 ...

  8. 2018.10.27 bzoj3209: 花神的数论题(数位dp)

    传送门 数位dpdpdp经典题. 题面已经暗示了我们按照二进制位来数位dpdpdp. 直接dpdpdp多少个数有111个111,222个111,333个111-, 然后快速幂算就行了. 于是我们枚举前 ...

  9. 【bzoj3209】 花神的数论题

    http://www.lydsy.com/JudgeOnline/problem.php?id=3209 (题目链接) 题意 ${sum(i)}$表示${i}$的二进制表示中${1}$的个数.求${\ ...

随机推荐

  1. jstl中添加自定义的函数

    由于jstl中提供的函数未必能够满足我们的要求,而我们又希望能够像jstl提供的函数那样能够轻松方便使用,那么可以通过自定义函数补充jsltl函数.给jstl添加自定义函数需要以下步骤: 定义一个st ...

  2. 安卓Intent(隐式)

    相对于显式Intent(明确指出了目标组件名称的Intent),隐式Intent,没有明确指出目标组件名称.显式Intent直接用组件的名称定义目标组件,这种方式很直接.但是由于开发人员往往并不清楚别 ...

  3. python基础知识九

    sys模块 sys模块包含系统对应的功能.我们已经学习了sys.argv列表,它包含命令行参数. 命令行参数 例14.1 使用sys.argv #!/usr/bin/python # Filename ...

  4. android studio 无法在可视化页面预览布局文件

    Rendering Problems the following classes could not be found:android.support.v7.internal.widget.Actio ...

  5. vc调用BCB的dll 参数传递 报错

    可能原因: 调用方式约定不一致. 函数调用约定如下: 1. __cdecl:C 和 C++ 程序的缺省调用规范. 2. __stdcall:标准调用约定(即WINAPI调用约定),也就是pascal调 ...

  6. [Twisted] 部署Twisted

    Twisted提供了基础设施,来实现可重用.可配置的方式来部署. 1.Service Twisted使用Service来实现了许多协议,如TCP,FTP,HTTP,SSH等. 实现的IService接 ...

  7. CoreAnimation5-图层时间和缓冲

    图层时间 动画的发生是需要持续一段时间的,所以计时对整个概念来说至关重要.在这一章中,我们来看看CAMediaTiming,看看Core Animation是如何跟踪时间的. CAMediaTimin ...

  8. Analyze 静态分析工具中显示 大量的CF类型指针 内存leak 问题, Core Foundation 类型指针内存泄漏

    Analyze 静态分析工具中显示 大量的CF类型指针 内存leak 问题   今天使用Analyze 看了下项目,   解决办法,项目中使用了ARC,OC的指针类型我们完全不考虑release的问题 ...

  9. php文件缓存

    1.最新代码 <?php class cache { private static $_instance = null; protected $_options = array( 'cache_ ...

  10. cell的循环使用

    cell的循环利用:(对cell的简单优化) 1.创建一个标示(Identifier),用于区分缓存池里的不同cell. 2.去缓存池里拿自己对应的cell,用到dequeueReusableCell ...