题目大意:
求n!转化为b进制后后导0的个数
思路:
我们首先考虑十进制转化为二进制者后,后导0的个数如何求
十进制数num
y = num%2
num/=2
如果y为0则,该位为0,就是求num能连续除以几次2(在整除的条件下)
十进制是num,进制为b
我们可以采取同样的思路
但是!
这里n!太大了,没法直接算出来
我们采取分解质因子的方式
同时我们对b也分解质因子(因为num要包含整个的b,如果b分解质因子之后的每一项都包含,则说明有整除关系)
n! --> a1[i]^b1[i] * a2[i]^b2[i] * a3[i]*b3[i]
b --> c1[i]^d1[i] * c2[i]^d2[i] * c3[i]*d3[i]
对b的每项在N!中查找包含了几个,取min就是答案
注意爆long long
Code:
ll n, b, ans = 1e18; ll cal(ll t, ll temp) { ll res = 0; ll nn = n; for(ll i = t; i <= n ; i *= t) { res += (n / i); if(i*t >n) break; } return res / temp; } void solve(ll num) { for(ll i = 1 ; i <= x ; i++) { ll t = p[i]; if(t > num) break; ll temp = 0; while(num % t == 0) { num /= t; temp++; } if(temp) ans = min(ans, cal(t, temp)); } if(num > 1) ans = min(ans, cal(num, 1)); } int main() { oula(); n = read(), b = read(); solve(b); out(ans); return 0; }View Code