【题目】洛谷10月月赛R1 提高组

【题意】求n!在k进制下末尾0的个数,n<=1e18,k<=1e16。

【题解】考虑10进制末尾0要考虑2和5,推广到k进制则将k分解质因数。

每个质因数在n!中的数量,以2为例是n/2+n/4+n/8...这样统计。(含x个就被统计x次)

最后得到凑出的k的个数就可以得到末尾0的个数。

分解质因数复杂度O(√k),也使用pollard rho算法可以加速。

  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <algorithm>
  5. #include <stdio.h>
  6.  
  7. const int Times = ;
  8. const int N = ;
  9.  
  10. using namespace std;
  11. typedef long long LL;
  12.  
  13. LL ct, cnt;
  14. LL fac[N], num[N];
  15.  
  16. LL gcd(LL a, LL b)
  17. {
  18. return b? gcd(b, a % b) : a;
  19. }
  20.  
  21. LL multi(LL a, LL b, LL m)
  22. {
  23. LL ans = ;
  24. a %= m;
  25. while(b)
  26. {
  27. if(b & )
  28. {
  29. ans = (ans + a) % m;
  30. b--;
  31. }
  32. b >>= ;
  33. a = (a + a) % m;
  34. }
  35. return ans;
  36. }
  37.  
  38. LL quick_mod(LL a, LL b, LL m)
  39. {
  40. LL ans = ;
  41. a %= m;
  42. while(b)
  43. {
  44. if(b & )
  45. {
  46. ans = multi(ans, a, m);
  47. b--;
  48. }
  49. b >>= ;
  50. a = multi(a, a, m);
  51. }
  52. return ans;
  53. }
  54.  
  55. bool Miller_Rabin(LL n)
  56. {
  57. if(n == ) return true;
  58. if(n < || !(n & )) return false;
  59. LL m = n - ;
  60. int k = ;
  61. while((m & ) == )
  62. {
  63. k++;
  64. m >>= ;
  65. }
  66. for(int i=; i<Times; i++)
  67. {
  68. LL a = rand() % (n - ) + ;
  69. LL x = quick_mod(a, m, n);
  70. LL y = ;
  71. for(int j=; j<k; j++)
  72. {
  73. y = multi(x, x, n);
  74. if(y == && x != && x != n - ) return false;
  75. x = y;
  76. }
  77. if(y != ) return false;
  78. }
  79. return true;
  80. }
  81.  
  82. LL pollard_rho(LL n, LL c)
  83. {
  84. LL i = , k = ;
  85. LL x = rand() % (n - ) + ;
  86. LL y = x;
  87. while(true)
  88. {
  89. i++;
  90. x = (multi(x, x, n) + c) % n;
  91. LL d = gcd((y - x + n) % n, n);
  92. if( < d && d < n) return d;
  93. if(y == x) return n;
  94. if(i == k)
  95. {
  96. y = x;
  97. k <<= ;
  98. }
  99. }
  100. }
  101.  
  102. void find(LL n, int c)
  103. {
  104. if(n == ) return;
  105. if(Miller_Rabin(n))
  106. {
  107. fac[ct++] = n;
  108. return ;
  109. }
  110. LL p = n;
  111. LL k = c;
  112. while(p >= n) p = pollard_rho(p, c--);
  113. find(p, k);
  114. find(n / p, k);
  115. }
  116.  
  117. int main()
  118. {
  119. LL n,kind;
  120. scanf("%lld%lld",&kind,&n);
  121. ct = ;
  122. find(n, );
  123. sort(fac, fac + ct);
  124. num[] = ;
  125. int k = ;
  126. for(int i=; i<ct; i++)
  127. {
  128. if(fac[i] == fac[i-])
  129. ++num[k-];
  130. else
  131. {
  132. num[k] = ;
  133. fac[k++] = fac[i];
  134. }
  135. }
  136. cnt = k;
  137. LL ans=(1ll<<);
  138. for(int i=;i<cnt;i++){
  139. LL as=,N=kind/fac[i];
  140. while(N){
  141. as+=N;
  142. N/=fac[i];
  143. }
  144. as/=num[i];
  145. ans=min(as,ans);
  146. }
  147. if(ans==1ll<<)ans=;
  148. printf("%lld",ans);
  149. return ;
  150. }

【Luogu】P3927 SAC E#1 - 一道中档题 Factorial的更多相关文章

  1. 【洛谷十月月测】 P3927 SAC E#1 - 一道中档题 Factorial

    题目传送门:https://www.luogu.org/problemnew/show/P3927 题目大意:给你两个正整数n,k,求n!在k进制下末尾零的数量. 我们通过简单的数学分析,便可以发现, ...

  2. 洛谷 P3927 SAC E#1 - 一道中档题 Factorial【数论//】

    题目描述 SOL君很喜欢阶乘.而SOL菌很喜欢研究进制. 这一天,SOL君跟SOL菌炫技,随口算出了n的阶乘. SOL菌表示不服,立刻就要算这个数在k进制表示下末尾0的个数. 但是SOL菌太菜了于是请 ...

  3. 洛谷-P3927 SAC E#1 - 一道中档题 Factorial

    原址 题目背景 数据已修改 SOL君(炉石主播)和SOL菌(完美信息教室讲师)是好朋友. 题目描述 SOL君很喜欢阶乘.而SOL菌很喜欢研究进制. 这一天,SOL君跟SOL菌炫技,随口算出了n的阶乘. ...

  4. [洛谷P3927]SAC E#1 - 一道中档题 Factorial

    题目大意:求$n!$在$k(k>1)$进制下末尾0的个数. 解题思路:一个数在十进制转k进制时,我们用短除法来做.容易发现,如果连续整除p个k,则末尾有p个0. 于是问题转化为$n!$能连续整除 ...

  5. SAC E#1 - 一道中档题 Factorial

    题目背景 SOL君(炉石主播)和SOL菌(完美信息教室讲师)是好朋友. 题目描述 SOL君很喜欢阶乘.而SOL菌很喜欢研究进制. 这一天,SOL君跟SOL菌炫技,随口算出了n的阶乘. SOL菌表示不服 ...

  6. noip模拟赛 SAC E#1 - 一道中档题 Factorial

    题目背景 数据已修改 SOL君(炉石主播)和SOL菌(完美信息教室讲师)是好朋友. 题目描述 SOL君很喜欢阶乘.而SOL菌很喜欢研究进制. 这一天,SOL君跟SOL菌炫技,随口算出了n的阶乘. SO ...

  7. 【Luogu】P3930 SAC E#1 - 一道大水题 Knight

    [题目]洛谷10月月赛R1 提高组 [题意]给定n*n棋盘和<=16个棋子,给几个棋子种类和攻击范围,现我方只有一马,求能否吃王. [算法]状压+BFS [题解]16种棋子中,马不能吃马,直接处 ...

  8. 【Luogu】 P3928 SAC E#1 - 一道简单题 Sequence2

    [题目]洛谷10月月赛R1 提高组 [算法]递推DP+树状数组 [题解]列出DP递推方程,然后用树状数组维护前后缀和. #include<cstdio> #include<cstri ...

  9. SAC E#1 - 一道神题 Sequence1

    题目背景 小强和阿米巴是好朋友. 题目描述 小强很喜欢数列.有一天,他心血来潮,写下了一个数列. 阿米巴也很喜欢数列.但是他只喜欢其中一种:波动数列. 一个长度为n的波动数列满足对于任何i(1 < ...

随机推荐

  1. Java常用类之Math类

    Java 的常用类Math类: java.lang.Math 提供了系列的静态方法用于科学计算,其方法的参数和返回值类型一般为 double 类型. 如: 1. public static final ...

  2. button type=“submit”

    写js遇到任何怪异的行为 一定要先看看是不是submit搞的鬼. 函数内部最后总是返回 return false; 也是一个好的习惯

  3. iOS- 如何将非ARC的项目转换成ARC项目(实战)

    1.前言   因为公司有个国外餐饮系统,编程开发了3-4年,之前用的都是非ARC,开发到今年,第一批迭代开发的人员早已不见,目前发现了有许多的内存泄露之类的,系统没有自动释放该释放的内存.一旦app长 ...

  4. CentOS 6安装thrift支持erlang开发

    早前,在我的博文thrift多平台安装介绍了如何在debian/ubuntu下面安装thrift,并支持erlang开发的.而在CentOS平台下,并没有成功安装.经过不断摸索,终于成功了,这篇博文就 ...

  5. 加密和数字签名工具GPG

    转载: 源文件位置:http://blog.chinaunix.net/uid-9525959-id-2001824.html GPG [功能]  GPG是加密和数字签名的免费工具,大多用于加密信息的 ...

  6. Redis架构演变与redis-cluster群集读写方案

    导言 redis-cluster是近年来redis架构不断改进中的相对较好的redis高可用方案.本文涉及到近年来redis多实例架构的演变过程,包括普通主从架构(Master.slave可进行写读分 ...

  7. 【Python】Python 过滤列表

    如你所知,Python 具有通过列表解析将列表映射到其它列表的强大能力.这种能力同过滤机制结合使用,使列表中的有些元素被映射的同时跳过另外一些元素.过滤列表语法: [mapping-expressio ...

  8. Mybatis笔记二

    一对一查询 案例:查询所有订单信息,订单信息中显示下单人信息. 注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询.如果从用户信息出发查询用户下的订单信息则 ...

  9. hdu 1528 Card Game Cheater (二分匹配)

    Card Game Cheater Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  10. 2018牛客多校第五场 E.room

    题意: 一共有n个宿舍,每个宿舍有4个人.给出第一年的人员分布和第二年的人员分布,问至少有多少人需要移动. 题解: 对于第一年的每个宿舍,向今年的每种组合连边.流量为1,费用为(4 - 组合中已在该宿 ...