UVA 10375 选择与除法

一看四个整数的范围,<=10000  所以我们肯定不能直接打表求阶乘

利用唯一分解定理(任何一个大于1的正整数都能够被唯一地分解成质因子乘积)

#include<iostream>
#include<string>
#include<string>
#include<string.h>
#include<stdio.h>
#include<queue>
#include<math.h>
#include<vector>
#include<stdlib.h>
#include<algorithm>
#define maxn 10010
using namespace std;
int primes[maxn],flag,t,e[maxn];
void add_integer(int n,int d){
    for(int i=0;i<t;i++){
        while(n%primes[i]==0){
            n/=primes[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(){
  int p,q,r,s;
  memset(primes,0,sizeof(primes));
  t=1;
  primes[0]=2;
    for(int i=3;i<=maxn;i++){
         flag=1;
        for(int k=2;k<=sqrt(i);k++){
                if(i%k==0){
                    flag=0;
                    break;
                }
            }
            if(flag){primes[t++]=i;}
        }
  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(r,-1);
     add_factorial(s,1);
     add_factorial(r-s,1);
     double ans=1;
     for(int i=0;i<t;i++){
           // cout<<primes[i]<<" "<<e[i]<<endl;
        ans*=pow(primes[i],e[i]);
     }
     printf("%.5lf\n",ans);

  }

   return 0;
}
时间: 2024-08-08 13:53:18

UVA 10375 选择与除法的相关文章

UVA 10375 Choose and divide(唯一分解定理)

这么大数的乘法.除法运算,肯定不能先全部乘起来,我的思路是计算出分子.分母上的每个数的个数(因为最大的数为10000,可以开一个数组记录个数). 利用了随机数方法终于知道错在哪了,中间如果出现连乘还是会溢出,这点没想到,以下是我的溢出代码: #include<stdio.h> #include<math.h> #include<iostream> #include<string.h> #include<stdlib.h> #include<

UVA 10375 Choose and divide(数论)

The binomial coefficient C(m,n) is defined as m! C(m,n) = -------- n!(m-n)! Given four natural numbers p, q, r, and s, compute the the result of dividing C(p,q) by C(r,s). The Input Input consists of a sequence of lines. Each line contains four non-n

uva 10375 唯一分解定理 筛法求素数【数论】

唯一分解理论的基本内容: 任意一个大于1的正整数都能表示成若干个质数的乘积,且表示的方法是唯一的.换句话说,一个数能被唯一地分解成质因数的乘积.因此这个定理又叫做唯一分解定理. 举个栗子:50=(2^1)*(5^2) 题目一般的思路就是要把素数表打出来,eg上面的例子 e={1,0,2,0,0......} 下面是两个题目,仅说说大致的思想: 题目一: E=(X1*X3*X4* ...*Xk)/X2   判断E是不是整数 如果把(X1*X3*X4* ...*Xk)分解成素数相乘,将X2也分解成素

uva 725 Division(除法)暴力法!

uva 725  Division(除法) A - 暴力求解 Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Description Write a program that finds and displays all pairs of 5-digit numbers that between them use the digits 0 through 9 once each, such that t

uva 10375

1 /* 选择与除法_________________________________________________________________________________ 2 3 #include <iostream> 4 #include <map> 5 #include <cmath> 6 #include <vector> 7 #include <cstdio> 8 #include <string> 9 #incl

【暑假】[数学]UVa 10375 Choose and divide

UVa 10375 Choose and divide 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19601 思路: maxn=10000 如果计算maxn!再保存的话显然装不下. 但答案由阶乘的积或商组成,所以可以用唯一分解定理求解.大题思路就是把目前答案的质因子的指数用数组e保存,乘除都对e操作. 需要注意的是筛法求素数优化后的写法. 代码: 1 #include<iostream> 2 #include

UVA - 10375 - Choose and divide (组合数)

题目传送:UVA - 10375 思路:用double存答案,不过要注意是边乘边除,这样不会爆double,还有记得乘的时候要把int转换成double AC代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> #include <queue> #include <stack> #

UVA 10375 Choose and divide

紫上给得比较奇怪,其实没有必要用唯一分解定理.我觉得这道题用唯一分解只是为了表示大数. 但是分解得到的幂,累乘的时候如果顺序很奇怪也可能溢出.其实直接边乘边除就好了.因为答案保证不会溢出, 设定一个精度范围,如果中间结果超过了精度范围就保存起来,最后sort一遍从两端同时乘就不会溢出了. /********************************************************* * --------------Tyrannosaurus--------- * * aut

例题10-3 选择与除法 UVa10375

1.题目描述:点击打开链接 2.解题思路:本题让计算两个组合数的商,既可以直接利用公式,也可以利用唯一分解定理:事先计算10000以内的所有素数,然后计算组合数分解后各个素数的幂,用数组e保存指数即可.这里计算指数时可以利用数论中求n!分解式中各个素因数指数的公式. 3.代码: (利用唯一分解定理) #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<string>