花神的数论题

题意描述:
  • 设\(sum(i)\)表示\(i\)的二进制数中\(1\)的个数。
  • 给定一个整数\(N\),求\(\prod_{i=1}^Nsum(i)\)。
输入描述:
  • 输入包含一个正整数\(N(N\leq10^{15})\)。
输出描述:
  • 一个数,答案模\(10000007\)的值。
解题思路:
  • 数位\(dp\)+快速幂。
  • 令\(f(i,j,k)\)表示以\(k\)开头的\(i\)位数中\(1\)的个数为\(j\)的数量。有转移方程
    • \(f(i,j,0)=f(i-1,j,0)+f(i-1,j,1)\)
    • \(f(i,j,1)=f(i-1,j-1,0)+f(i-1,j-1,1)\)
    • 这个很好理解,就是往最高位填\(0/1\)。
  • 设\(sum(i)==x\)的\(i\)有\(tot\)个,那么他对答案的贡献显然就是\(x^{tot}\)。
  • 所以这时候枚举\(x\)就行,显然对于\(N(N\leq 10^{15})\)而言,不会枚举超过\(60\)次。
  • 详见代码:
代码:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int maxn = 70, mod = 10000007;
  5. ll f[maxn][maxn][2];
  6. ll n, ans;
  7. inline ll qmi(ll a, ll b)
  8. {
  9. ll res = 1;
  10. while(b)
  11. {
  12. if(b & 1) res = (res * a) % mod;
  13. a = (a * a) % mod;
  14. b >>= 1ll;
  15. } return res % mod;
  16. }
  17. //x对应的二进制中有多少个1
  18. inline ll len(ll x)
  19. {
  20. ll res = 0;
  21. while(x)
  22. {
  23. if(x & 1ll) res++;
  24. x >>= 1ll;
  25. }
  26. return res;
  27. }
  28. int num[maxn], cnt;
  29. inline void work(ll x)
  30. {
  31. cnt = 0; ans = 1;
  32. while(x) //分解数位
  33. {
  34. num[++cnt] = x&1;
  35. x >>= 1;
  36. }
  37. //枚举m, 求出有多少i,有sum(i)=m
  38. for(int m = 1; m <= cnt; m++)
  39. {
  40. for(int i = 1; i < cnt; i++)
  41. ans = (ans * qmi(m, f[i][m][1]) % mod) % mod;
  42. //先枚举位数比n要小的数
  43. //开始处理位数和n相同的数字
  44. int k = m;
  45. //如果n的最高位是1的话
  46. //其实相当于把最高位固定了
  47. if(num[cnt]) k--;
  48. //从高位往低位枚举
  49. //之后我们让第i位小于n的第i位
  50. //这样可以让第i位后面的数字随便填写
  51. for(int i = cnt - 1; i >= 1; i--)
  52. {
  53. for(int j = 0; j < num[i]; j++)
  54. ans = (ans * qmi(m, f[i][k][j]) % mod) % mod;
  55. if(num[i]) k--; //相当于把第i位固定 因为i有1 所以k--
  56. if(k < 0) break;
  57. }
  58. }
  59. //由于一直卡上界,所以其实一直没有遇到等于n的情况
  60. //所以最后对n暴力分解数位处理一下
  61. ans = ((ans % mod) * (len(n) % mod)) % mod;
  62. printf("%lld\n", ans);
  63. }
  64. inline void init()
  65. {
  66. scanf("%lld", &n);
  67. //dp预处理
  68. f[1][0][0] = f[1][1][1] = 1;
  69. for(int i = 1; i <= 60; i++)
  70. {
  71. for(int j = 0; j <= i; j++)
  72. {
  73. f[i+1][j+1][1] += f[i][j][0] + f[i][j][1];
  74. f[i+1][j][0] += f[i][j][0] + f[i][j][1];
  75. }
  76. } work(n);
  77. }
  78. int main()
  79. {
  80. init();
  81. return 0;
  82. }

luogu_4317: 花神的数论题的更多相关文章

  1. BZOJ 3209: 花神的数论题 [数位DP]

    3209: 花神的数论题 题意:求\(1到n\le 10^{15}\)二进制1的个数的乘积,取模1e7+7 二进制最多50位,我们统计每种1的个数的数的个数,快速幂再乘起来就行了 裸数位DP..\(f ...

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

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

  3. 【LG4317】花神的数论题

    [LG4317]花神的数论题 题面 洛谷 题解 设\(f_{i,up,tmp,d}\)表示当前在第\(i\)位,是否卡上界,有\(tmp\)个一,目标是几个一的方案数 最后将所有\(d\)固定,套数位 ...

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

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

  5. [BZOJ3209]花神的数论题 组合数+快速幂

    3209: 花神的数论题 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2498  Solved: 1129[Submit][Status][Disc ...

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

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

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

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

  8. bzoj3209:3209: 花神的数论题

    觉得还是数位dp的那种解题形式但是没有认真的想,一下子就看题解.其实还是设置状态转移.一定要多思考啊f[i][j]=f[i-1][j]+g[i-1][j] g[i][j]=f[i-1][j-1]+g[ ...

  9. [Bzoj3209]花神的数论题(数位dp)

    3209: 花神的数论题 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2633  Solved: 1182[Submit][Status][Disc ...

随机推荐

  1. markdown使用emoji

    前几日写博客的时候在想是否能够在markdown中使用emoji呢

  2. Django中一些常用的文档段落

    1. Settings¶ STATIC_URL¶ MEDIA_ROOT¶ MEDIA_URL¶ AUTH_USER_MODEL¶ USE_I18N¶ USE_L10N¶ USE_TZ¶    (三者默 ...

  3. 英语SouthRedAgate南红玛瑙

    南红玛瑙(SouthRedAgate)是玛瑙的一个种类,古称”赤玉”,质地细腻油润,是中国独有的品种.由于产量稀少,老南红玛瑙价格急剧上升.南红玛瑙曾被古人用之入药,养心养血. 现在的南红玛瑙已经和和 ...

  4. linux如何执行定时任务

    前言:最近在做一个前端监控系统,用到分表分库的功能,由于代码上无法做到实时新建表,所以只能够曲线救国,使用linux系统的定时任务来完成. ============================== ...

  5. Linux装B命令

    原文:https://mp.weixin.qq.com/s/CNmMRjl0iZ8EBPq5VgJHsA 1.空心字体 yum install -y figlet figlet happy 1.0 2 ...

  6. web模拟终端 --使用shellinabox

    关于shellinabox ShellInABox实现了一个Web服务器,可以将任意命令行工具导出到基于Web的终端仿真器.任何支持JavaScript和CSS的Web浏览器都可以访问此模拟器,并且不 ...

  7. 分享一篇最近新写的jquery注册页面表单校验的程序,仅供参考

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. 【Linux】在linux上java工具jps jstat jinfo等命令找不到怎么办

    一.yum安装方式 1)搜索openjdk-devel相关的安装包 yum search java|grep jdk 2)安装对应的版本 yum install -y java-1.8.0-openj ...

  9. P1092 虫食算[搜索]

    这个式子是是由\(A\sim A+N\)组成的,那么\(A\sim A+N\)就只能等于\(0\sim N-1\),因此我们每次对\(A\sim A+N\)的取值做一个新的排列,然后judge一下当前 ...

  10. 《快活帮》第八次团队作业:Alpha冲刺

    项目 内容 这个作业属于哪个课程 2016计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十二 团队作业8-软件测试与ALPHA冲刺 团队名称 快活帮 作业学习目标 (1)掌握 ...