組合數的計算以及組合數對p取餘後結果的計算

2022-03-29 11:58:35 字數 1305 閱讀 7552

前奏:統計 n! 中的所有質因子中pi的個數

普通方法:複雜度o(nlogn), 當n為10的18次方無法承受

//

複雜度o(nlogn), n為10的18次方無法承受

int cal(int n, int

p) }

return

ans;

}

改進後的方法:複雜度只有o(logn)

int cal(int n, int

p)

return

ans;

}

1. 組合數的計算(如果只需計算乙個組合數則用法三,如果計算很多個組合數則用法二)

法一:通過定義計算

long

long c(long

long n, long

long

m)

for (long

long i = 1; i <= m; i++)

for (long

long i = 1; i <= n - m; i++)

return

ans;

}

法二:通過遞推式計算

int res[100][100];            //

用於存放組合數的值

//法二:通過遞推式計算

long

long c(long

long n, long

long

m)

把所有組合數都計算出來

//

把所有組合數都計算出來

const

int n = 60

;void

calc()

for (int i = 2; i <= n; i++)

}}

long

long c(long

long n, long

long

m)}

2. 計算c(n, m) % p

遞迴

//

遞迴int res[1010][1010] = ;

int c(int n, int m, int

p)

非遞迴

void calc(int n, int

p)

for (int i = 2; i <= n; i++)

}}

組合數取餘

組合數c n,m k的計算 遞推公式 c n,m c n 1,m c n 1,m 1 一邊計算一邊取餘 時間複雜度o n2 適用範圍m,n 1000,k為自然數 include using namespace std int c 1001 1001 intmain for int i 1 i n i...

對組合數取模

看這個之前建議先看一下n!對於組合數我們可以將其表示成階乘的形式 c n,k 那我們不妨把這三個階乘全部表示成上個專題的形式。這樣的話,如果對於 e1 e2 e3 就可以被 p整除,e1 e2 e3 就無法被 p整除。在無法被整除的情況下 c n,k a1 a2a3 11 int mod comb ...

計算組合數

1.防溢位 如果直接用c n,m n!n m m 來程式設計很可能會在算n!時就爆了long long,所以每一步最好把除分母也算上。所以對於c n,m 來說取m min m,n m 來算c n,m n n 1 n 2 n m 1 m m 1 m 2 1 顯然分子分母都是m項相乘,從後往前去算 先算...