浏览器标题切换
浏览器标题切换end

第十一届蓝桥杯B组国赛C/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;
}
posted @   抓水母的派大星  阅读(239)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
历史上的今天:
2020-04-15 POJ1113-Wall-求凸包周长
2020-04-15 POJ3348-Cows-求凸包面积
点击右上角即可分享
微信分享提示