Problem - C - Codeforces
Aki喜欢数字,尤其是那些带有尾随零的数字。例如,数字9200有两个尾随零。Aki认为数字拥有的尾随零越多,它就越漂亮。
然而,Aki认为,一个数字拥有的尾随零的数量并不是固定的,而是取决于它所表示的基数(进制)。因此,他考虑了一些数字和基数的情况。现在,由于他使用的数字变得相当奇怪,他请求你帮他计算这些数字的美丽度。
给定两个整数n和b(以十进制表示),你的任务是计算n!(n的阶乘)在b进制(以b作为基数)表示下末尾零的个数。
输入 输入仅包含一行,两个整数n和b(1≤n≤1018,2≤b≤1012)。
输出 输出一个整数——n!在b进制表示下末尾零的个数。
Examples
input
Copy
6 9
output
Copy
1
input
Copy
38 11
output
Copy
3
input
Copy
5 2
output
Copy
3
input
Copy
5 10
output
Copy
1
在第一个例子中,6!(十进制)=720(十进制)=880(九进制)。
在第三和第四个例子中,5!(十进制)=120 (十进制)=1111000(二进制)。
如果将数字x表示为b进制基数的d1,d2,…,dk,则x=d1bk−1+d2bk−2+…+dkb0,其中di是整数,且0≤di≤b−1。例如,第一个例子中的数字720可以表示为880(九进制),因为720=8⋅92+8⋅9+0⋅1。
您可以在此处阅读有关进制的更多信息。
题解:
结尾有多少个0,就是n!可以被b整除多少次
但是由于数都很大,整常写肯定不行
那我们把数换一种形式
n! = p1^a1*p2^a2....pk^ak
b = p1^b1*p2^b2*p3^b3....pk^bk
要想被整除
是不是对于n!与b共有的质因子的数目,ai >= bi
得到ci = ai /bi,是不是代表每个质因子最多被除几次,
要想整体都被整除,就应该找到最大的ci
关于求某个质因子在n的阶乘中的个数,板子如下,证明(我也不会)
int get(int n,int x)
{
int ans = 0;
while(n)
{
ans += n/x;
n /= x;
}
return ans;
}
完整代码
#include <cstdio>
#include <cstring>
#include <algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
#define int long long
typedef pair<int,int> PII;
int mod = 1e9 + 7;
map<int,int> cnt;
vector<int> pri;
int get(int n,int x)
{
int ans = 0;
while(n)
{
ans += n/x;
n /= x;
}
return ans;
}
void solve()
{
int n,b;
cin >> n >> b;
for(int i = 2;i*i <= b;i++)
{
if(b%i == 0)
{
pri.push_back(i);
while(b%i == 0)
{
cnt[i]++;
b /= i;
}
}
}
if(b > 1)
{
pri.push_back(b);
cnt[b]++;
}
int ans = 1e18;
for(int i = 0;i < pri.size();i++)
{
ans = min(ans,get(n,pri[i])/cnt[pri[i]]);
}
cout << ans;
}
//5 7 8 9 10
signed main()
{
// ios::sync_with_stdio(0);
// cin.tie(0);cout.tie(0);
int t = 1;
// cin >> t;
while(t--)
{
solve();
}
}