题目链接
线性筛出10000以内素数表,求出唯一分解式中各个素数的指数
#include<cstdio>
#include<cstring>
#include<cmath>
#define _rep(i,a,b) for(int i=(a);i<=(b);i++)
#define _for(i,a,b) for(int i=(a);i<(b);i++)
const int N=1e4+10;
int prime[N],top=0;//打素数表的时候习惯写成p,结果后面也有p,WA半天没查出错...
bool iscomp[N];
int mi[N];
void primetable()//线性筛
{
_rep(i,2,10000)
{
if(!iscomp[i])prime[top++]=i;
for(int j=0;j<top&&i*prime[j]<=10000;j++)
{
iscomp[i*prime[j]]=1;
if(i%prime[j]==0)break;
}
}
}
inline void compute(int n,int d)//唯一分解定理
{
_for(i,0,top)
{
while(n%prime[i]==0)n/=prime[i],mi[i]+=d;
if(n==1)break;
}
}
inline void jc(int n,int d)//阶乘
{
_rep(i,1,n)
compute(i,d);
}
void solve(int p,int q,int r,int s)//组合数
{
double ans=1;
jc(p,1);
jc(q,-1);
jc(p-q,-1);
jc(r,-1);
jc(s,1);
jc(r-s,1);
_for(i,0,top)
ans*=pow(prime[i],mi[i]);
printf("%.5lf\n",ans);
}
int main()
{
//freopen("in.txt","r",stdin);
primetable();
int p,q,r,s;
while(~scanf("%d%d%d%d",&p,&q,&r,&s))
{
memset(mi,0,sizeof(mi));
solve(p,q,r,s);
}
return 0;
}