第十一届蓝桥杯B组国赛C/C++

题意

100的阶乘有多少个约数?

唯一分解定理

唯一分解定理:N = p1a1*p2a2p3^a3 ... *pn^an(其中p1、p2、... pn为N的因子,a1、a2、... 、an分别为因子的指数)

求N的因子个数:sum=(1 + a1)*(1 + a2)*(1 + a3)*...*(1 + an)

本题答案是:39001250856960000
类似题见:https://www.cnblogs.com/OFSHK/p/11329177.html

AC代码

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
typedef long long ll;

bool book[110];
int p[110],a[110],cnt=0;

//180=2*2*3*3*5=2^2 * 3^2 *5
//180的正约数个数=(1+2)(1+2)*(1+1)=18

//void init() // 求100以内的所有素数(包括100)
//{
//    for(int i=1; i<=100; i++)
//    {
//        if(i==1) continue;
//        if(!book[i])
//        {
//            p[cnt++]=i;
//            for(int j=i+i; j<=100; j+=i)
//                book[j]=1;
//        }
//    }
//}

//ll yinzi(int a)//求N的因子个数sum=(1 + a1)*(1 + a2)*(1 + a3)*...*(1 + an);
//{
//    ll sum=1;
//    for(int i=0; i<cnt&&(p[i]*p[i]<=a); i++)
//    {
//        if(p[i]>a) break;
//        if(a%p[i]==0)
//        {
//            ll x=0;
//            while(a%p[i]==0)
//                a/=p[i],x++;
//            sum*=(1+x);
//        }
//    }
//    if(a>1)//说明还剩有1个素数因子没有被算入,根据公式可得
//        sum=sum*(1+1);
//    return sum;
//}

void yinzi()
{
    for(int i=2; i<=100; i++)
    {
        int n=i;
        for(int j=2; j<=n/j; j++)
        {
            while(n%j==0)
                a[j]++,n/=j;
        }
        if(n>1) a[n]++;
    }
}

int main()
{
    // init();
    yinzi();
    ll ans=1;
    for(int i=2; i<=100; i++)
    {
//      ans*=yinzi(i);
        if(a[i]) ans=ans*(a[i]+1);
    }
    cout<<ans<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/OFSHK/p/14664282.html