排列數是在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程式設計計算出數值。經查閱得知通過階乘 排列數的對應命令如下 筆者天真的以為通過下...