[GDKOI2014] Факториал [решение небольшой проблемы Коньяка]

Описание

Вставьте описание изображения сюда

Ввод

В первой строке записано положительное целое число 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

Нет, нет, этого никто не может понять, да?

рекомендация

отblog.csdn.net/qq_49972640/article/details/107990698
рекомендация