《pytorch 入門學習——2. 詞向量和語言模型》
阿新 • • 發佈:2020-08-13
階乘
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\)
對 \(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); } } }