1. 程式人生 > 實用技巧 >《pytorch 入門學習——2. 詞向量和語言模型》

《pytorch 入門學習——2. 詞向量和語言模型》

階乘

Description

Input

第一行有一個正整數T,表示測試資料的組數。
接下來的T行,每行輸入兩個十進位制整數n和base。

Output

對於每組資料,輸出一個十進位制整數,表示在base進位制下,n!結尾的零的個數。

Sample Input

2
10 10
10 2

Sample Output

2
8

Data Constraint

對於20%的資料,n<=20,base<=16
對於50%的資料,n<=10^9,base<=10^5
對於100%的資料,1<=T<=50,0<=n<=10^18,2<=base<=10^12

解題思路

題意為求\(n! = base ^ i * g\)

中的\(i\)

\(n\)\(base\) 都進行質因數分解即可求出

Code

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
long long n,m,d[1000010],c[1000010];
int t,vis[1000010],p[1000010],tot = 0,cnt = 0;

void init()
{
	vis[1] = 1;
	for (int i = 2; i <= 1000005; i++)
	{
		if (!vis[i]) p[++tot] = i;
		for (int j = 1; j <= tot && p[j] * i <= 1000005; j++)
		{
			vis[p[j] * i] = 1;
			if (i % p[j] == 0) break;
		}
	}
}
int main()
{
	init();
	scanf("%d",&t);
	while (t--)
	{
		scanf("%lld%lld",&n,&m);
		int i = 1;
		long long y = m;
		cnt = 0;
		memset(c,0,sizeof(c));
		while (y > 1)
		{
			if (i > tot) break;
			if (y % p[i] == 0) d[++cnt] = p[i];
			while (y % p[i] == 0) c[cnt]++,y /= p[i];
			i++;
		}
		if (y != 1 && y) d[++cnt] = y,c[cnt]++;
		if (cnt)
		{
			long long mv = 0x3f3f3f3f3f3f3f3f;
			for (i = 1; i <= cnt; i++)
			{
				long long k = 0,l = d[i];
				while (l <= n)
				{
					k += (long long)n / l;
					if (l > n / d[i]) break;
					l *=(long long) d[i];
				}
				mv = min(mv,k / c[i]);
			}
			printf("%lld\n",mv);
		}
		else
		{
			long long k = 0,l = m;
			while (l <= n)
			{
				k += (long long)n / l;
				if (l > n / m) break;
				l *= (long long)m;
			}
			printf("%lld\n",k);
		}
	}
}