组合计数不取模&高精度乘法&质因分解预处理

可能需要报课才能做
题目:https://www.acwing.com/problem/content/890/wzw

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N=1e6+9;
int prime[N];
int vis[N];
int cnt;
int sum[N];
void init(int n){  //线性筛
    vis[0]=vis[1]=1;
    for(int i=2;i<=n;i++){
        if(vis[i]==0)prime[cnt++]=i;
        for(int j=0;prime[j]*i<=n;j++){
            vis[prime[j]*i]=1;
            if(i%prime[j]==0)break;
        }
    }
    return ;
}
int get(int n,int p){  //看这个阶乘里面包含多少个p因数
    int res=0;
    while(n){
        res+=n/p;
        n=n/p;
    }
    return res;
}
vector<int> mul(vector<int>vec,int p){  //高精度乘法,大数乘以正常数
    int t=0;
    vector<int>temp;   //新建一个过渡的容器
    for(int i=0;i<vec.size();i++){
        t+=vec[i]*p;
        temp.push_back(t%10);
        t=t/10;
    }
    while(t){   //如果t还存在数,就继续加入容器
        temp.push_back(t%10);
        t=t/10;
    }
    return temp; //返回这个过渡容器
}
int main()
{
    int a,b;
    cin>>a>>b;
    init(a);
    for(int i=0;i<cnt;i++){   //质因分解
        int p=prime[i];
        sum[i]=get(a,p)-get(b,p)-get(a-b,p);//存下保留下来的p的个数
    }
    vector<int>vec; //申请一个容器,用来进行高精度乘法
    vec.push_back(1);
    for(int i=0;i<cnt;i++){
        for(int j=0;j<sum[i];j++){
            vec=mul(vec,prime[i]);
        }
    }
    int pos=vec.size()-1;
    while(pos>=0){
        printf("%d",vec[pos--]);
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值