您的位置:首页 > 其它

SAC E#1 - 一道中档题 Factorial

2017-10-10 09:21 330 查看

https://www.luogu.org/problem/show?pid=3927

题目背景

数据已修改

SOL君(炉石主播)和SOL菌(完美信息教室讲师)是好朋友。

题目描述

SOL君很喜欢阶乘。而SOL菌很喜欢研究进制。

这一天,SOL君跟SOL菌炫技,随口算出了n的阶乘。

SOL菌表示不服,立刻就要算这个数在k进制表示下末尾0的个数。

但是SOL菌太菜了于是请你帮忙。

输入输出格式

输入格式:

每组输入仅包含一行:两个整数n,k。

输出格式:

输出一个整数:n!在k进制下后缀0的个数。

输入输出样例

输入样例#1:

10 40


输出样例#1:

2


说明

对于20%的数据,n <= 1000000, k = 10

对于另外20%的数据,n <= 20, k <= 36

对于100%的数据,n <= 10^12,k <= 10^12

update

1.一组数据

2.K不会==1

3.现在std没有爆long long

4.对数据有问题联系icy (建议大家不要面向数据编程)

思路

质因数分解k,然后查找n!里的质数可以组成多少个k;

代码实现

#include<cmath>
#include<cstdio>
#define LL long long
using namespace std;
const int maxn=1e6+10;
inline LL min_(LL x,LL y){return x<y?x:y;}
LL n,k,ans;
LL s[maxn],ss;
int main(){
scanf("%Illd%Illd",&n,&k),ans=n;
LL a,b,c;
for(LL i=2;i*i<=k;i++)
for(LL j=0;;j++){
if(j==ss){
s[ss++]=i;
if(k%i==0){
a=b=0,c=i;
while(k%i==0){k/=i,b++;}
while(n>=c){a+=n/c,c*=i;}
ans=min_(ans,a/b);
}
break;
}
if(i%s[j]==0) break;
}
if(k!=1){
a=0,c=k;
while(n>=c){a+=n/c,c*=k;}
ans=min_(ans,a);
}
printf("%Illd\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: