【Luogu】P3927 SAC E#1 - 一道中档题 Factorial
【题目】洛谷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算法可以加速。
- #include <iostream>
- #include <stdlib.h>
- #include <string.h>
- #include <algorithm>
- #include <stdio.h>
- const int Times = ;
- const int N = ;
- using namespace std;
- typedef long long LL;
- LL ct, cnt;
- LL fac[N], num[N];
- LL gcd(LL a, LL b)
- {
- return b? gcd(b, a % b) : a;
- }
- LL multi(LL a, LL b, LL m)
- {
- LL ans = ;
- a %= m;
- while(b)
- {
- if(b & )
- {
- ans = (ans + a) % m;
- b--;
- }
- b >>= ;
- a = (a + a) % m;
- }
- return ans;
- }
- LL quick_mod(LL a, LL b, LL m)
- {
- LL ans = ;
- a %= m;
- while(b)
- {
- if(b & )
- {
- ans = multi(ans, a, m);
- b--;
- }
- b >>= ;
- a = multi(a, a, m);
- }
- return ans;
- }
- bool Miller_Rabin(LL n)
- {
- if(n == ) return true;
- if(n < || !(n & )) return false;
- LL m = n - ;
- int k = ;
- while((m & ) == )
- {
- k++;
- m >>= ;
- }
- for(int i=; i<Times; i++)
- {
- LL a = rand() % (n - ) + ;
- LL x = quick_mod(a, m, n);
- LL y = ;
- for(int j=; j<k; j++)
- {
- y = multi(x, x, n);
- if(y == && x != && x != n - ) return false;
- x = y;
- }
- if(y != ) return false;
- }
- return true;
- }
- LL pollard_rho(LL n, LL c)
- {
- LL i = , k = ;
- LL x = rand() % (n - ) + ;
- LL y = x;
- while(true)
- {
- i++;
- x = (multi(x, x, n) + c) % n;
- LL d = gcd((y - x + n) % n, n);
- if( < d && d < n) return d;
- if(y == x) return n;
- if(i == k)
- {
- y = x;
- k <<= ;
- }
- }
- }
- void find(LL n, int c)
- {
- if(n == ) return;
- if(Miller_Rabin(n))
- {
- fac[ct++] = n;
- return ;
- }
- LL p = n;
- LL k = c;
- while(p >= n) p = pollard_rho(p, c--);
- find(p, k);
- find(n / p, k);
- }
- int main()
- {
- LL n,kind;
- scanf("%lld%lld",&kind,&n);
- ct = ;
- find(n, );
- sort(fac, fac + ct);
- num[] = ;
- int k = ;
- for(int i=; i<ct; i++)
- {
- if(fac[i] == fac[i-])
- ++num[k-];
- else
- {
- num[k] = ;
- fac[k++] = fac[i];
- }
- }
- cnt = k;
- LL ans=(1ll<<);
- for(int i=;i<cnt;i++){
- LL as=,N=kind/fac[i];
- while(N){
- as+=N;
- N/=fac[i];
- }
- as/=num[i];
- ans=min(as,ans);
- }
- if(ans==1ll<<)ans=;
- printf("%lld",ans);
- return ;
- }
【Luogu】P3927 SAC E#1 - 一道中档题 Factorial的更多相关文章
- 【洛谷十月月测】 P3927 SAC E#1 - 一道中档题 Factorial
题目传送门:https://www.luogu.org/problemnew/show/P3927 题目大意:给你两个正整数n,k,求n!在k进制下末尾零的数量. 我们通过简单的数学分析,便可以发现, ...
- 洛谷 P3927 SAC E#1 - 一道中档题 Factorial【数论//】
题目描述 SOL君很喜欢阶乘.而SOL菌很喜欢研究进制. 这一天,SOL君跟SOL菌炫技,随口算出了n的阶乘. SOL菌表示不服,立刻就要算这个数在k进制表示下末尾0的个数. 但是SOL菌太菜了于是请 ...
- 洛谷-P3927 SAC E#1 - 一道中档题 Factorial
原址 题目背景 数据已修改 SOL君(炉石主播)和SOL菌(完美信息教室讲师)是好朋友. 题目描述 SOL君很喜欢阶乘.而SOL菌很喜欢研究进制. 这一天,SOL君跟SOL菌炫技,随口算出了n的阶乘. ...
- [洛谷P3927]SAC E#1 - 一道中档题 Factorial
题目大意:求$n!$在$k(k>1)$进制下末尾0的个数. 解题思路:一个数在十进制转k进制时,我们用短除法来做.容易发现,如果连续整除p个k,则末尾有p个0. 于是问题转化为$n!$能连续整除 ...
- SAC E#1 - 一道中档题 Factorial
题目背景 SOL君(炉石主播)和SOL菌(完美信息教室讲师)是好朋友. 题目描述 SOL君很喜欢阶乘.而SOL菌很喜欢研究进制. 这一天,SOL君跟SOL菌炫技,随口算出了n的阶乘. SOL菌表示不服 ...
- noip模拟赛 SAC E#1 - 一道中档题 Factorial
题目背景 数据已修改 SOL君(炉石主播)和SOL菌(完美信息教室讲师)是好朋友. 题目描述 SOL君很喜欢阶乘.而SOL菌很喜欢研究进制. 这一天,SOL君跟SOL菌炫技,随口算出了n的阶乘. SO ...
- 【Luogu】P3930 SAC E#1 - 一道大水题 Knight
[题目]洛谷10月月赛R1 提高组 [题意]给定n*n棋盘和<=16个棋子,给几个棋子种类和攻击范围,现我方只有一马,求能否吃王. [算法]状压+BFS [题解]16种棋子中,马不能吃马,直接处 ...
- 【Luogu】 P3928 SAC E#1 - 一道简单题 Sequence2
[题目]洛谷10月月赛R1 提高组 [算法]递推DP+树状数组 [题解]列出DP递推方程,然后用树状数组维护前后缀和. #include<cstdio> #include<cstri ...
- SAC E#1 - 一道神题 Sequence1
题目背景 小强和阿米巴是好朋友. 题目描述 小强很喜欢数列.有一天,他心血来潮,写下了一个数列. 阿米巴也很喜欢数列.但是他只喜欢其中一种:波动数列. 一个长度为n的波动数列满足对于任何i(1 < ...
随机推荐
- Java常用类之Math类
Java 的常用类Math类: java.lang.Math 提供了系列的静态方法用于科学计算,其方法的参数和返回值类型一般为 double 类型. 如: 1. public static final ...
- button type=“submit”
写js遇到任何怪异的行为 一定要先看看是不是submit搞的鬼. 函数内部最后总是返回 return false; 也是一个好的习惯
- iOS- 如何将非ARC的项目转换成ARC项目(实战)
1.前言 因为公司有个国外餐饮系统,编程开发了3-4年,之前用的都是非ARC,开发到今年,第一批迭代开发的人员早已不见,目前发现了有许多的内存泄露之类的,系统没有自动释放该释放的内存.一旦app长 ...
- CentOS 6安装thrift支持erlang开发
早前,在我的博文thrift多平台安装介绍了如何在debian/ubuntu下面安装thrift,并支持erlang开发的.而在CentOS平台下,并没有成功安装.经过不断摸索,终于成功了,这篇博文就 ...
- 加密和数字签名工具GPG
转载: 源文件位置:http://blog.chinaunix.net/uid-9525959-id-2001824.html GPG [功能] GPG是加密和数字签名的免费工具,大多用于加密信息的 ...
- Redis架构演变与redis-cluster群集读写方案
导言 redis-cluster是近年来redis架构不断改进中的相对较好的redis高可用方案.本文涉及到近年来redis多实例架构的演变过程,包括普通主从架构(Master.slave可进行写读分 ...
- 【Python】Python 过滤列表
如你所知,Python 具有通过列表解析将列表映射到其它列表的强大能力.这种能力同过滤机制结合使用,使列表中的有些元素被映射的同时跳过另外一些元素.过滤列表语法: [mapping-expressio ...
- Mybatis笔记二
一对一查询 案例:查询所有订单信息,订单信息中显示下单人信息. 注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询.如果从用户信息出发查询用户下的订单信息则 ...
- hdu 1528 Card Game Cheater (二分匹配)
Card Game Cheater Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- 2018牛客多校第五场 E.room
题意: 一共有n个宿舍,每个宿舍有4个人.给出第一年的人员分布和第二年的人员分布,问至少有多少人需要移动. 题解: 对于第一年的每个宿舍,向今年的每种组合连边.流量为1,费用为(4 - 组合中已在该宿 ...