UVA-10375 选择与除法(唯一分解定理)

传送门:https://cn.vjudge.net/problem/UVA-10375

题意:

已知C(m,n)=m!/(n!(m-n)!),输入整数p,q,r,s(p>=q,r>=s,p,q,r,s<=10000),计算C(p,q)/C(r,s)。输入保证不超过10^{8},保留5位小数。

分析:

首先,求出10000以内的所有素数prime,然后用数组e表示当前结果的唯一分解式中各个素数的指数。例如,e={1,0,2,000,···}表示2^{1}*5^{2}=50

以下代码中函数add_int(int n,int d)的作用是d=0时分解n,d=-1时分解1/n;add_fac(int n,int d)的作用是计算(n!)^d。

代码:

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

double qsm(double a,int b){
	if(b<0)
		return qsm((1.0/a),-b);
	double res=1;
	while(b){
		if(b&1)
			res*=a;
		a*=a;
		b>>=1;
	}
	return res;
}

const int N = 2e5 + 5;
bool isprime[N];
int cntp=0, prime[N/10], phi[N], e[N/10];
 
void init(){
    memset(isprime, 1, sizeof(isprime));
    isprime[0] = isprime[1] = 0; cntp = 0;
    phi[1] = 1;
    for(int i = 2; i < N; ++i){
        if(isprime[i]){
            prime[++cntp] = i;
            phi[i] = i - 1;
        }
        for(int j = 1; j <= cntp && i * prime[j] < N; ++j){
            isprime[i * prime[j]] = 0;
            if(i % prime[j] == 0){
                phi[i * prime[j]] = phi[i] * prime[j];
                break ;
            }
            phi[i * prime[j]] = phi[i] * phi[prime[j]];
        }
    }
}
void add_int(int n,int d){//d=0表示乘以n;d=-1表示除以n 
	for(int i=1;i<=cntp;i++){
		while(n%prime[i]==0){
			n/=prime[i];
			e[i]+=d;
		}
		if(n==1) break;
	}
}
void add_fac(int n,int d){//计算(n!)^d 
	for(int i=1;i<=n;i++)
		add_int(i,d);
}
int main(){
	init();
	int p,q,r,s;
	while(~scanf("%d%d%d%d",&p,&q,&r,&s)){
		memset(e,0,sizeof(e));
		add_fac(p,1);
		add_fac(q,-1);
		add_fac(p-q,-1);
		add_fac(r,-1);
		add_fac(s,1);
		add_fac(r-s,1);
		double ans=1;
		for(int i=1;i<=cntp;i++)
			ans*=qsm(prime[i],e[i]);
		printf("%.5lf\n",ans);
	}
	return 0;
} 

 

Android校园二手交易App项目源码(高分期末大作业),个人经导师指导并认可通过的高分设计项目,评审分98分,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!主要针对计算机相关专业的正在做大作业、毕业设计的学生和需要项目实战练习的学习者,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 Android校园二手交易App项目源码(高分期末大作业)Android校园二手交易App项目源码(高分期末大作业)Android校园二手交易App项目源码(高分期末大作业)Android校园二手交易App项目源码(高分期末大作业)Android校园二手交易App项目源码(高分期末大作业)Android校园二手交易App项目源码(高分期末大作业)Android校园二手交易App项目源码(高分期末大作业)Android校园二手交易App项目源码(高分期末大作业)Android校园二手交易App项目源码(高分期末大作业)Android校园二手交易App项目源码(高分期末大作业)Android校园二手交易App项目源码(高分期末大作业)Android校园二手交易App项目源码(高分期末大作业)Android校园二手交易App项目源码(高分期末大作业)Android校园二手交易App项目源码(高分期末大作业)Android校园二手交易App项目源码(高分期末大作业)Android校园二手交易App项目源码(高分期末大作业)Android校园二手交易App项目源码(高分期末大作业)Android校园二手交易App项目源码(高分期末大作业)Android校园二手交易App项目源码(高分期末大作业)Android校园二手交易App项目源码(高分期末大作业)Android校园二手交易App项目源码(高分期末大作业)And
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值