排列數A n, m 的計算

2021-07-05 09:03:23 字數 871 閱讀 9235

排列數是在n個互不相同的數中選出m個能組成的不同次序的排列的方案數。

公式上就等於組合數*全排列,即a(n, m) = n! / (n-m)!

可以說是a1*a2*a3……*am,ai = n-m+i。所以也是乙個巨大的數,在計算時通常會要求模p。

舉一道題:

給出n, m, p,求a(n, m) % p。

雖然m很小,但是鑑於n,p的範圍,直接乘會爆,即使是unsigned long long也儲存不下36位的數字。一開始的高精度也爆了(高精乘高精爆了表示很不理解tat),表示無力。

那麼為了不使過程量爆long long,我們回歸最原始的加法運算,不過用類似快速冪的快速乘來加速這個過程。

l mult(l i, l j, l p)

return

ans;

}

還有遞迴式的。

l mult(l i, l j, l p)
然而還有某神犇的o(1)快速乘:

原作者本題網頁中見。

l mult(l x, l y, l p)
完整**:

#include 

#include

#include

typedef

long

long l;

using

namespace

std;

l n, m, p;

l mult(l x, l y, l p)

l calc(l l, l r, l p)

return ans;

}int main()

poj1150 求排列Anm的末尾非0數字

題意 求npm,即n個元素的m中排列方式結果中末尾非0 的數字。思路 首先我們知道,2和5相乘末尾非0數字為1,相當於可以相消。我們先把這兩個因子抽離出來,考慮末尾為3,7,9的數字。設f n,x 為 n!因子中,抽離了2,5,後末尾數字為x的因子個數。分析可以知道f n,x f n 2,x g n...

數的全排列

什麼是數的全排列呢?這裡舉個例子 123的全排列是123,132,213,231,312,321。那麼接下來,我們用程式來實現輸出1 n的全排列。解決思路1 使用列舉法,嘗試所有的可能性 源 include include define n 100 int a n int n 4 int m int...

MATLAB計算階乘 排列數與組合數

在1500件產品中有400件次品,1100件 任取200件 求恰有90件次品的概率 求至少有兩件次品的概率。這是一道古典概型的概率問題,題目比較簡單,很容易求得概率,其中 但是,計算量較大,於是筆者希望通過maltab程式設計計算出數值。經查閱得知通過階乘 排列數的對應命令如下 筆者天真的以為通過下...