欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

UVA - 10375 Choose and divide

程序员文章站 2022-03-11 19:57:10
...

UVA - 10375 Choose and divide

思路:
唯一分解定理。

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



const int MAXN=10000+10;
int prime[MAXN];
int e[MAXN];
void getPrime()
{
    memset(prime,0,sizeof(prime));
    for(int i=2;i<=MAXN;i++)
    {
        if(!prime[i])prime[++prime[0]]=i;
        for(int j=1;j<=prime[0]&&prime[j]<=MAXN/i;j++)
        {
            prime[prime[j]*i]=1;
            if(i%prime[j]==0)break;
        }

    }
}



void add_integer(int n,int d)
{
    for(int i=0;i<MAXN;i++)
    {
        while(n%prime[i]==0)
        {
            n/=prime[i];
            e[i]+=d;
        }
        if(n==1)break;
    }
}
void add_factorial(int n,int d)
{
    for(int i=1;i<=n;i++)
    {
        add_integer(i,d);
    }
}

int main()
{
    getPrime();
    int p,q,r,s;
    while(cin>>p>>q>>r>>s)
    {
        memset(e,0,sizeof(e));
        add_factorial(p,1);
        add_factorial(q,-1);
        add_factorial((p-q),-1);
        add_factorial(s,1);
        add_factorial((r-s),1);
        add_factorial(r,-1);
        double ans=1;
        for(int i=0;i<MAXN;i++)
        {
            ans*=pow(prime[i],e[i]);
        }
        printf("%.5lf\n",ans);
    }
    return 0;
}
相关标签: 唯一分解定理