题目传送门:https://www.luogu.org/problemnew/show/P3927

题目大意:给你两个正整数n,k,求n!在k进制下末尾零的数量。

我们通过简单的数学分析,便可以发现,n!可以化为x*k^y(x,y∈N),而末尾零的数量,正是y。

经过进一步化简,$n! = x*\prod_{1}^{d(k)}d_{i}*y_{i}$,其中$d_{i}$为k的素因子,此处d(k)表示k的素因子个数,在已知d的情况下,求$y$并不复杂。

同时,我们也可以将k也化为这个格式,$k = *\prod_{1}^{d(k)}d_{i}*y'_{i}$。

通过进一步的归纳,我们发现:末尾零的数量为$min(\left \lfloor  y_{i}/y'_{i}    \right \rfloor)$。此题我们只需要求出$d_{i}$,随后求出$y_{i}$和$y‘_{i}$,最后简单计算即可得出答案。

考虑到$k≤10^{12}$,如果用常规的方法进行分解质因数求出所有$d_{i}$显然不行,于是我们用pollard_rho进行分解质因数即可。

如果你不知道什么是pollard_rho,传送门:http://blog.csdn.net/maxichu/article/details/45459533

时间复杂度为$O(k^{0.25}*log(n)*d(k))$

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #define L long long
  5. #include<algorithm>
  6. #include<map>
  7. using namespace std;
  8. L gcd(L x,L y){return y==?x:gcd(y,x%y);}
  9. L mul(L x,L y,L MOD){
  10. L ans=;
  11. while(y){
  12. if(y&) ans=(ans+x)%MOD;
  13. y=y>>; x=(x<<)%MOD;
  14. }
  15. return ans;
  16. }
  17. bool pow(L x,L y,L MOD){
  18. L ans=;
  19. while(y){
  20. if(y&) ans=mul(ans,x,MOD);
  21. y=y>>; x=mul(x,x,MOD);
  22. }
  23. return ans!=;
  24. }
  25. bool check(L n){
  26. if(n==) return ; if(n<||n%==) return ;
  27. int t=; while(t--) if(pow(+rand()%(n-),n-,n)) return ;
  28. return ;
  29. }
  30. L pollard_rho(L n,L c){
  31. L x=+rand()%(n-),y=x,k=;
  32. for(int i=;;i++){
  33. x=(mul(x,x,n)+c)%n;
  34. L d=gcd((y-x+n)%n,n);
  35. if(d>) return d;
  36. if(x==y) return n;
  37. if(i==k) y=x,k<<=;
  38. }
  39. }
  40. map<L,int> m;
  41. void find(L n,L c){
  42. if(n==) return;
  43. if(check(n)){m[n]++; return;}
  44. L p=n; while(p>=n) p=pollard_rho(n,c--);
  45. find(p,c); find(n/p,c);
  46. }
  47. L get(L n,L d){
  48. L ans=;
  49. while(n) ans+=n/d,n=n/d;
  50. return ans;
  51. }
  52.  
  53. int main(){
  54. L n,k,minn=1e18; cin>>n>>k; find(k,);
  55. for(map<L,int>:: iterator it=m.begin();it!=m.end();it++){
  56. L num=it->first,sum=it->second;
  57. minn=min(minn,get(n,num)/sum);
  58. }
  59. cout<<minn<<endl;
  60. }

【洛谷十月月测】 P3927 SAC E#1 - 一道中档题 Factorial的更多相关文章

  1. 【Luogu】P3927 SAC E#1 - 一道中档题 Factorial

    [题目]洛谷10月月赛R1 提高组 [题意]求n!在k进制下末尾0的个数,n<=1e18,k<=1e16. [题解]考虑10进制末尾0要考虑2和5,推广到k进制则将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. [HNOI2009]双递增序列(洛谷P4728)+小烈送菜(内部训练题)——奇妙的dp

    博主学习本题的经过嘤嘤嘤: 7.22 : 听学长讲(一知半解)--自己推(推不出来)--网上看题解--以为自己会了(网上题解是错的)--发现错误以后又自己推(没推出来)--给学长发邮件--得到正确解法 ...

  8. 洛谷 P6776 - [NOI2020] 超现实树(找性质,神仙题)

    洛谷题面传送门 nb tea 一道! 首先考虑怎样入手分析这个看似非常不可做的问题.首先题目涉及高度无穷的树,根本枚举不了.不过我们冷静一下就会发现,如果我们记 \(mx=\max\limits_{i ...

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

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

随机推荐

  1. tomcat中如何配置虚拟路径

    第一步:打开server.xml配置文件.在Host节点里写上该行代码: <Context path="/upload" docBase="E:\upload&qu ...

  2. 2018.07.04 POJ 2398 Toy Storage(二分+简单计算几何)

    Toy Storage Time Limit: 1000MS Memory Limit: 65536K Description Mom and dad have a problem: their ch ...

  3. memmove、memcpy、strcpy、memset的实现

    memmove.memcpy.strcpy.memset 原型为: void *memmove( void* dest, const void* src, size_t count ); char*  ...

  4. flask_模板

    由于python中生成html比较繁琐,所以flask自动为你配置好jinjia2模板.下面我们开始学习模板应用吧~ 1.编写microblog模块 注:(1)这里为了渲染模板,我们从Flask导入了 ...

  5. slice、substring、substr

    slice() 定义和用法 slice() 方法可从已有的数组中返回选定的元素. string.slice(start, end)提取一个字符串 string.substring(start, end ...

  6. Java源码更改的方式

    1.找到要改的类所在包名地址. 比如标签名的更改: <s:debug></s:debug> (1)ctril+鼠标左键========双击标签,就会弹出标签所在的类的文本 (2 ...

  7. [转]谈谈 Mifare Classic 破解

    Mifare Classic 提供 1 Kb - 4Kb 的容量,现在国内采用的多数是 Mifare Classic 1k(S50)[后面简称 M1 卡] M1 卡有从 0 到 15 共 16 个扇区 ...

  8. 不用快捷键就能使用Eclipse的自动完成功能

    偶然间看到了这个,或许有和我一样不喜欢按 alt-/ 兄弟用得上.不用老去按那个 alt-/ 了,还是方便不少.         打开 Eclipse -> Window -> Perfe ...

  9. DIV+CSS 中的 overflow:hidden

    overflow:hidden这个CSS样式是大家常用到的CSS样式,但是大多数人对这个样式的理解仅仅局限于隐藏溢出,而对于清除浮动这个含义不是很了解. 一提到清除浮动,我们就会想到另外一个CSS样式 ...

  10. spring的事务传播属性

    一.Propagation (事务的传播属性) Propagation : key属性确定代理应该给哪个方法增加事务行为.这样的属性最重要的部份是传播行为.有以下选项可供使用:PROPAGATION_ ...