Описание
Ввод
В первой строке записано положительное целое число T, которое указывает количество групп тестовых данных.
В следующей строке T введите два десятичных целых числа n и основание в каждой строке.
Вывод
Для каждой группы данных выведите десятичное целое число, которое представляет количество нулей в конце n! В базовой системе.
Пример ввода
2
10 10
10 2
Пример вывода
2
8
анализ
На первый взгляд, вопросы этого типа считаются заключительными. Итак, как же сделать вывод?
С помощью метода шестнадцатеричного преобразования мы вводим, положим N! N!N ! Преобразовать вммКоличество нулей в конце после основания M равноN! N!N ! РазделитьMMЧастота M , с которой мы можем превратить проблему вN! N!N ! Может делитьMMравномерноМ сколько раз.
Тогда вывод готов - разложение MMПростые множители M иNNНайдите номер каждого простого множителя в N и, наконец, найдитеmin minm i n { сумма [p [i]] сумма [p [i]] s u m [ p [ i ] ] } подойдет.
(Примечание: здесь p [i] p [i]валюта p- [ I ] иiiпростой множитель i ,сумма, суммаs u m - номер этого простого множителя)
Разве это не выходит?
Поместите уродливый код ниже
//L.E.M.T专用水印
#include<cstdio>
#include<iostream>
#include<algorithm>
#define ulll unsigned long long
using namespace std;
ulll n,m,e,an,ans,cnt,bj[1000005],b[1000005];
ulll find(ulll x)//寻找答案
{
ulll end=0x3f3f3f3f3f3f3f3f3f3f;
for (ulll i=1;i<=cnt;i++)
{
ulll p=x,sum=0;
while (p>0)
{
p/=1ull*b[i];
sum+=1ull*p;
}
end=min(1ull*end,1ull*sum/bj[i]);//取一个最小值
}
return end;
}
void fen(ulll x)//分解质因数
{
ulll p=x;
cnt=0;
for (ulll i=2;i<=1000000;i++)//只运行到1e6,不然会炸,剩下的怎么处理看下面
{
int bz=0;
while (p%i==0&&p>0)
{
if (bz==0)
{
cnt++;
b[cnt]=i;
bj[cnt]=0;
}
bj[cnt]++;
bz=1;
p/=i;
}
if (p==1)
{
break;
}
}
if (p>1)//注意:如果我们分解完1——1e6的质因数还有剩余的话就把剩余部分直接当做一个质因数处理,不然会炸喔~~~~~~~~~~~~
{
cnt++;
b[cnt]=p;
bj[cnt]=1;
}
}
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
scanf("%llu%llu",&n,&m);//读入
fen(m);//先分解质因数
ulll ans=find(n);//再寻找答案
printf("%llu\n",ans);//输出
}
}
LOVE E.M.T