码蹄集2230--square 高精度乘低精度,组合数

本文介绍了一种计算阶乘质因子分解的方法,通过分子分母的质因数分解存储在数组中,并利用高精度乘法技术求解最终结果。作者在CSDN博客中分享了这段代码实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C_{m+n}^{m}=\frac{(m+n)!}{m!n!}=\frac{(m+1)(m+2)\cdot \cdot \cdot(m+n)}{1\cdot 2\cdot3\cdot\cdot\cdot n}种走法,因为需要向上走m步,向右走n步。

显然分子分母分别算出,再相除不太可能,那么分别求出分子和分母的质因子相乘的形式。分子存入up数组中,分母存入down数组中,数组中的元素对应之差final_数组即代表分子分母相除后的质因子相乘的形式。与博客相似:码蹄集2218--阶乘的质因子_sweet_Mary的博客-CSDN博客

再利用高精度*低精度求得最终的结果。与博客相似:码蹄集2197--个数统计_sweet_Mary的博客-CSDN博客

代码如下:

#include<bits/stdc++.h> 
using namespace std;

int up[100010];//分子
int down[100010];//分母
int final_[100010];//分子-分母
int m,n;
int max_up;//记录因子最大值--分子
int max_down;//记录因子最大值--分母
int max_final;
int a[100010];


//寻找因子
void change(int a[],int num,int& max_up_or_down){
    int temp=num;
    for(int i=2;i*i<=temp;i++){
        if(temp%i==0){
            while(temp%i==0){
                a[i]++;
                max_up_or_down=max(max_up_or_down,i);
                temp/=i;
            }
        }
    }
    if(temp!=0 and temp!=1){
        a[temp]++;
        max_up_or_down=max(max_up_or_down,temp);
    }

}

//高精度*低精度
//a*num==>c
void multiply(int num,int& len_){
    int c[100010]={0};
    for(int i=0;i<len_;i++){
        c[i]+=a[i]*num;
        if(c[i]>=10){
            c[i+1]=c[i]/10;
            c[i]%=10;
        }
    }
    while(c[len_]){
        if(c[len_]>=10){
            c[len_+1]+=c[len_]/10;
            c[len_]%=10;
        }
        len_++;
    }
    memcpy(a,c,sizeof(c));
}



int main( )
{   
    cin>>m>>n;
    for(int i=m+1;i<=m+n;i++){
        change(up,i,max_up);
    }
    for(int i=1;i<=n;i++){
        change(down,i,max_down);
    }
    for(int i=2;i<=max_up;i++){
        final_[i]=up[i]-down[i];
        if(final_[i]!=0){
            max_final=max(max_final,i);
        }
    }
    a[0]=1;
    int len_=1;
    for(int i=2;i<=max_final;i++){
        while(final_[i]){
            multiply(i,len_);
            final_[i]--;
        }
    }
    for(int i=99,k=1;i>=0;i--,k++){
        cout<<a[i];
        if(k==10){
            cout<<endl;
            k=0;
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值