UVA10375唯一分解定理运用

来源:互联网 发布:windows ftp命令详解 编辑:程序博客网 时间:2024/06/01 09:26

这里写图片描述

本题用到了唯一分解定理,唯一分解定理就是指任意一个数可以被分解为若干素数相乘的形式。数学描述不太严谨,但我想大家都懂的。
话不多说贴代码吧。

#include <iostream>#include <cstdio>#include <cmath>#include <cstring>using namespace std;const int maxn = 1e4+20;int p,q,r,s;int prime[maxn],e[maxn],tot;bool v[maxn];void init(){    memset(v,1,sizeof(v));    int m = sqrt(maxn+0.5);    tot = 0;    for (int i=2; i<=m; i++) if (v[i]){        for (int j=i*i; j<maxn; j+=i) v[j] = 0;    }    for (int i=2; i<maxn; i++) if (v[i]) prime[++tot] = i;}void add_integer(int n, int d){   for (int i=1; i<=tot; i++) {      while (n%prime[i] == 0) {e[i]+=d; n/=prime[i];}      if (n==1) break;   }}void add_factorial(int n, int d){    for (int i=2; i<=n; i++) add_integer(i,d);}int main(){    init();    while (scanf("%d %d %d %d",&p,&q,&r,&s)!=EOF){        memset(e,0,sizeof(e));        add_factorial(p,1);        add_factorial(q,-1);        add_factorial(p-q,-1);        add_factorial(r,-1);        add_factorial(r-s,1);        add_factorial(s,1);        double ans = 1;        for (int i=1; i<=tot; i++) ans *= pow(prime[i],e[i]);        printf("%.5lf\n",ans);    }    return 0;}
原创粉丝点击