1. 程式人生 > >Choose and divide (分解質因子,組合數相除)

Choose and divide (分解質因子,組合數相除)

題意:

已知p,q,r,s。求C(p,q) / C(r,s)。

演算法:

利用組合數的計算公式

         m!
C(m,n) = --------
         n!(m-n)!

可以得到C(p,q)  = p!/(q!*(p-q)!) * = p*(p-1)*(p-2)*...*(p-q+1)/q!

C(r,s) = r!/(s!*(r-s)!) = r*(r-1)*(r-2)*...*(r-s+1)/s!

C(p,q) / C(r,s) = p*(p-1)*(p-2)*...*(p-q+1)*s!/ [r*(r-1)*(r-2)*...*(r-s+1)*q!]

把分子分母中的每個數分解質因子,分子中的數分解的質因子對應個數+1,分母中的-1。

這實際上就是一個約分的過程。

然後計算最後結果,對於所有的質因子,如果個數>0,則乘;個數<0,則除。

===========================================================

一般處理組合數學問題的策略就是能約分的先約分,能化簡的先化簡,能除的先除,

不要全部乘起來再除掉

這篇題解寫得好贊~\(≧▽≦)/~

#include<cstdio>
#include<iostream>
#include<cstring>
#define maxn 10005

using namespace std;

int c[maxn];

void solve(int x,int f)
{
    for(int i=2;x>1;i++)
    {
        if(x%i==0)
        {
            while(x>1 && !(x%i))
            {
                c[i]+=f;
                x/=i;
            }
        }
    }
}

int main()
{
    int p,q,r,s;
    while(scanf("%d%d%d%d",&p,&q,&r,&s)!=EOF)
    {
        memset(c,0,sizeof(c));
        for(int i=p;i>=p-q+1;i--)
            solve(i,1);
        for(int i=s;i>=1;i--)
            solve(i,1);
        for(int i=r;i>=r-s+1;i--)
            solve(i,-1);
        for(int i=q;i>=1;i--)
            solve(i,-1);
        double ans = 1;
        for(int i=2;i<=maxn;i++)
        {
            if(c[i]>0)
            {
                for(int j=1;j<=c[i];j++)
                    ans*=i;
            }
            else
            {
                c[i] = -c[i];
                for(int j=1;j<=c[i];j++)
                    ans/=i;
            }
        }
        printf("%.5lf\n",ans);
    }
    return 0;
}


相關推薦

Choose and divide (分解因子合數

題意: 已知p,q,r,s。求C(p,q) / C(r,s)。 演算法: 利用組合數的計算公式 m! C(m,n) = -------- n!(m-n)! 可以得到C(p,q)  = p!/(q!*(p-q)!) * = p*(p-

UVa 10375 - Choose and divide(唯一分解定理

ide clas 數組 AI AS lin buffered ring buffere 鏈接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_p

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

divide include n! reg pan gist inline har class 題目 題目大意 已知\(C(m, n) = m! / (n!(m - n)!)\), 輸入整數\(p\), \(q\), \(r\), \(s\)(\(p ≥ q\), \(r

uva10375 Choose and Divide(唯一分解定理)

題意:已知C(m,n)=m! / (n!*(m-n!)),輸入整數p,q,r,s(p>=q,r>=s,p,q,r,s<=10000),計算C(p,q)/C(r,s)。輸出保證不超過10^8,保留5位小數 解題思路: 初步分析,本題時間上基本上沒有太大的限

NOIP--最大公約數和最小公倍數(數論分解因子

題目描述輸入二個正整數x0,y0(2<=x0<100000,2<=y0<=1000000),求出滿足下列條件的P,Q的個數條件:1.P,Q是正整數2.要求P,Q以x0為最大公約數,以y0為最小公倍數.試求:滿足條件的所有可能的兩個正整數的個數.輸入輸出格式輸入格式:二個正整數x0,y0

【數論】Choose and Divide, UVa10375 【組合數學】【唯一分解定理】【精度】

唯一分解定理 #include<bits/stdc++.h> using namespace std; int p,q,r,s,prime[10005],cnt,e[10005];boo

【UVA】10375-Choose and divide合數化簡

根據定義每個數肯定能化成這樣的形式: p1^a * p2 ^ b * p3 ^ c ……,這裡 p1,p2,……pn都是素數 先快速打出素數表,之後統計沒個素數出現個個數就可以了 14024226 10375 Accepted C++ 0.325 2014-0

uva 10375 Choose and Divide

ans std ble 遍歷 bre color ios 素數 and 將要求的數離散為素數的指數,然後遍歷一遍素數表。。。。 #include <cstdio> #include <iostream> #include <cstring&g

Choose and Divide UVa10375 題解

質因數 void ostream cto back 直接 -1 display pla   兩個超大組合數相除。解法是分解質因數,用數組記錄每個質因數稱或除的次數,最後直接遍歷數組計算即可 #include<iostream> #include<cst

Choose and divide UVA - 10375

cstring div n) define all inpu small you sample Choose and divide UVA - 10375 The binomial coefficient C(m, n) is defined as C(m, n) = m

階乘分解因子指數和

print ber bsp star input blog integer pri num The factorial function, n! = 1·2·...·n, has many interesting properties. In this problem, w

BZOJ 1025 [SCOI2009]遊戲 (DP+分解因子)

題意: 若$a_1+a_2+\cdots+a_h=n$(任意h<=n),求$lcm(a_i)$的種類數 思路: 設$lcm(a_i)=x$, 由唯一分解定理,$x=p_1^{m_1}+p_2^{m_2}+\cdots+p_{tot}^{m_{tot}}$ 設$b_i=p_i^{m_i}$,

【只含因子的數】(2018第九屆藍橋杯省賽 C/C++ A(第四題

第四題 題目標題:第幾個幸運數到x星球旅行的遊客都被髮給一個整數,作為遊客編號。x星的國王有個怪癖,他只喜歡數字3,5和7。國王規定,遊客的編號如果只含有因子:3,5,7,就可以獲得一份獎品。我們來看前

菜鳥系列——pollard_rho分解因子

菜鳥就要老老實實重新學起: pollard_rho分解質因子: 利用miller-rabin和pollard_rho演算法進行大素數判斷和素因子分解。 模版: long long factor[1000];//質因數分解結果(剛返回時是無序的) int sum;//質因數的

POJ3421 X-factor Chains【分解因子+組合數學】

題意簡述:輸入正整數x,求x的因子組成的滿足任意前一項都能整除後一項的序列的最大長度,以及所有不同序列的個數。 問題分析: 首先要對x進行因子分解。這樣可以得到總的因子個數c,不同的因子為f1,f2,...,fn其次方數分別為e1,e2,...,en。那麼,不同序列的個數

UVA 10375 Choose and divide(組合數學)

Problem D: Choose and divide The binomial coefficient C(m,n) is defined as m! C(m,n) = -------- n!(m-n)! Given four

Choose and divide(數論)(組合數學

題目大意:給出  p ,q, r, s這四個數,C(m, n) = m! / (m − n)! n!   ,讓你求解   C(p, q)by C(r, s)  ,即兩個階乘相除。 思路:(   p!*

java 藍橋杯 分解因子

問題描述   求出區間[a,b]中所有整數的質因數分解。 輸入格式   輸入兩個整數a,b。 輸出格式   每行輸出一個數的分解,形如k=a1*a2*a3...(a1<=a2<=a3...,k也是從小到大的)(具體可看樣例) 樣例輸入 3 10

HDU 4135 Co-prime (容斥+分解因子)

16px target 所有 val 容斥 http namespace printf tar <題目鏈接> 題目大意:   給定區間[A,B](1 <= A <= B <= 10 15)和N(1 <=N <= 10 9),求出

等式(分解因子因子個數

連結:https://www.nowcoder.com/acm/contest/90/F來源:牛客網時間限制:C/C++ 1秒,其他語言2秒空間限制:C/C++ 32768K,其他語言65536K 64bit IO Format: %lld題目描述 給定n,求1/x + 1