UVA10375 选择与除法 Choose and divide 题解

题目链接:

https://www.luogu.org/problemnew/show/UVA10375

分析:

这道题可以用唯一分解定理来做。

什么是唯一分解定理?百度即可,这里也简介一下。

对于任意一个自然数,都可以写成一些素数的幂次相乘的结果

比如说, 26 = 13 2 26=13*2 26=132, 30 = 2 3 5 30=2*3*5 30=235.

然后说详细做法:

首先make一个素数表prime,具体怎么做呢?

先用一个模板筛出合数:

for(int i=2;i<=100;i++)
{
	if(vis[i]!=1)
		for(int j=i*i;j<=10000;j+=i)
		vis[j]=1;
}
反正蒟蒻孤陋寡闻,这已经是我知道最快的造表法了

弄出了合数,我们再把每一个素数记到一个vector里

for(int i=2;i<=10000;i++)
	{
		if(vis[i]==0)
		{
			prime.push_back(i);
		}
	}	

这样为了之后循环幂次方便(一次完成,胜造多组数据

之后就套公式

C ( m , n ) = n ! ( m n ) ! m ! C(m,n)=^{m!}_{n!(m-n)!} C(m,n)=n!(mn)!m!

(中间的除号被吞了
用唯一分解来表示每个数,方便约分,因为此题的实质就是解决越界问题。

E n d End End

代码:

#include<cstdio>
#include<cmath>
#include<vector>
#include<cstring>
using namespace std;
int vis[10005];
vector<int>prime;
int e[10005];
void search(int n,int d)
{
	for(int i=0;i<prime.size();i++)
	{
		while(n%prime[i]==0)
		{
			n=n/prime[i];
			e[i]+=d;
		}
		if(n==1)break;
	}
}
void pd(int n,int d)
{
	for(int i=1;i<=n;i++)
	{
		search(i,d);
	}
}
int main()
{
	for(int i=2;i<=100;i++)
	{
		if(vis[i]!=1)
		for(int j=i*i;j<=10000;j+=i)
		vis[j]=1;
	}
	for(int i=2;i<=10000;i++)
	{
		if(vis[i]==0)
		{
			prime.push_back(i);
		}
	}	
	int p,q,r,s;
	while(scanf("%d%d%d%d",&p,&q,&r,&s)==4)
	{
		memset(e,0,sizeof(e));
		pd(p,1);
		pd(q,-1);
		pd(p-q,-1);
		pd(r,-1);
		pd(s,1);
		pd(r-s,1);
		double ans=1;
		for(int i=0;i<prime.size();i++)
		{
			ans*=pow(prime[i],e[i]);
		} 
		printf("%.5lf\n",ans);
	}
	return 0;
} 
全部评论

相关推荐

01-14 10:23
已编辑
湖南师范大学 计调
太久没更新,前几天看到一条评论,说“牛客就是当年那群做题区毕业了开始找工作还收不住那股味”的群体。字里行间透着居高临下的评判,不是,他该不会以为自己很幽默?很犀利吧?作为在牛客混了不算短日子的用户,我感到的不只是被冒犯,更是一种深刻的悲哀——这种以“松弛感”为名,对另一种生存策略的轻蔑,颇有一种自己考不上大学早早出来混社会,嘲笑考上大学的人是书呆子,然后大言不惭地说:死读书有什么用,人脉和资源才是硬道理。我不知道说这个话的人,手头究竟握着多少真正管用的人脉与资源,也不知道他这么傲慢地说出“那股味”的时候,是站在哪一个巨人的肩膀上,才能如此“松弛从容”地俯视众生,还能品评出别人身上“没收住”的余...
淬月星辉:这种评论把正常的努力扭曲成卷😂,说白了就是自己不努力,看着身边努力的人一个个都事业有成了,自己的心里开始不平衡了,就发这种酸言酸语。牛客可以说是我用过那么多平台里社区氛围最好的论坛了,用了大半年了,基本上没见过有人吵架的,都是在互帮互助提建议,帮忙看简历的,帮忙选offer的,帮忙指点学习路线的,分享工作经验和趣事的,我觉得这才是互联网该有的样子。
点赞 评论 收藏
分享
2025-12-28 16:32
重庆邮电大学 Java
程序员花海:1.技能放最后,来面试默认你都会,技能没啥用 2.实习写的看起来没啥含金量,多读读部门文档,包装下 接LLM这个没含金量 也不要用重构这种 不会给实习生做的 3.抽奖这个还是Demo项目,实际在公司里面要考虑策略,满减,触发点,触发规则 库存 之类的,不是这个项目这么简单 4.教育背景提前,格式为 教育背景 实习 项目 技能 自我评价
简历被挂麻了,求建议
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务