zoukankan      html  css  js  c++  java
  • N!中素因子p的个数 【数论】

    求N!中素因子p的个数,也就是N!中p的幂次

    公式为:cnt=[n/p]+[n/p^2]+[n/p^3]+...+[n/p^k];

    例如:N=12,p=2

    12/2=6,表示1~12中有6个数是2的倍数,即2,4,6,8,10,12

    12/2^2=6/2=3,表示1~12中有3个数是4的倍数,即4,8,12,它们能在提供2的基础上多提供一个2

    12/2^3=3/2=1,表示1~12中有1个数是8的倍数,即12,它能在提供两个2的基础上又多提供一个2

    代码为:

    1 int cnt=0;
    2 while(N){
    3     cnt+=N/p;
    4     N/=p;
    5 }

    刚开始一直不懂代码为什么这么写,其实就是当第一次算完n/p后,下一次需要算n/(p*p)=(n/p)/p,即上面写法。这是一个最好的写法,我本来想这么写:

    1 //错误写法
    2 int cnt=0;
    3 while(N>=p){
    4     cnt+=N/p;
    5     p*=p;
    6 }

    显然,每次N除的是p的幂次,但是每次p*=p时,p是会变的,也就是每次除的并不是p的依次递增的幂次,可以改成这样:

    1 int cnt=0;
    2 int t=p;
    3 while(N>=p){
    4     cnt+=N/p;
    5     p*=t;
    6 }

     参考博客:https://www.cnblogs.com/dilthey/p/7588382.html

  • 相关阅读:
    HTML的基础
    样式表
    页面布局
    for 循环
    函数
    数组
    样式属性
    css选择器参考手册
    样式表格及选择器
    表单
  • 原文地址:https://www.cnblogs.com/zxhyxiao/p/8026280.html
Copyright © 2011-2022 走看看