c语言阶乘分解成素因子,阶乘的素因子分解(SOJ 2763)

问题:给出两个数$N(1\le N\le 10^{9})$和$B(2\le B\le 100000)$,求解$N!$以$B$为基表达时末尾$0$的个数。

例子:(1)$7!$以$10$为基时等于$5040$,此时末尾有$1$个$0$.

(2)$7!$以$2$为基时表示为$1001110110000$,此时末尾有$4$个$0$.

分析:以$B$为基时,$N!$中末尾$0$的个数就等于$N!$能被$B$整除的次数。所以我们先对$B$做素因子分解,如下所示

$p_{1}, x_{1}$

$p_{2}, x_{2}$

$\dots$

$p_{k}, x_{k}$

即$B=p_{1}^{x_{1}}p_{2}^{x_{2}}\dots p_{k}^{x_{k}}$,然后根据勒让德定理,分别取得$N!$对应素因子$p_{1},p_{2},\dots,p_{k}$的个数$y_{1},y_{2},\dots,y_{k}$,则

$N!$能被$B$整除的次数为

$\min\{\frac{y_{1}}{x_{1}},\frac{y_{2}}{x_{2}},\dots,\frac{y_{k}}{x_{k}}\}$.

代码:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

#include

#include

#include

#include

using namespace std;

int num[100005];

int prime[9593];

int pnT;

void sieve(int n)

{

int i, j;

memset(num, 0, sizeof(num));

int m = sqrt(0.5 + n);

for (i = 2; i <= m; i++)

if (!num[i])

for (j = i*i; j <= n; j += i)

num[j] = 1;

pnT = 0;

for (i = 2; i <= n; i++)

if (num[i] == 0)

{

pnT++;

prime[pnT] = i;

}

}

int pTab[7][2];

int nNum;

void pnF(int n)

{

int i;

nNum = 0;

int temp;

for (i = 1; i <= pnT; i++)

{

if (n < prime[i])

break;

if (n%prime[i] == 0)

{

nNum++;

pTab[nNum][1] = prime[i];

temp = 0;

while (n%prime[i] == 0)

{

n /= prime[i];

temp++;

}

pTab[nNum][2] = temp;

}

}

}

int n_p(int n,int p)

{

int count = 0;

while (n >= p)

{

count += n / p;

n /= p;

}

return count;

}

int main()

{

int N, B;

sieve(100000);

int i;

int ans;

while (~scanf("%d%d", &N, &B) && N)

{

ans = 0x3f3f3f3f;

pnF(B);

for (i = 1; i <= nNum; i++)

ans = min(ans, n_p(N, pTab[i][1]) / pTab[i][2]);

printf("%d\n", ans);

}

return 0;

}

View Code

标签:dots,le,2763,SOJ,int,num,阶乘,include,末尾

来源: https://www.cnblogs.com/ClearMoonlight/p/10579255.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值