組合數取模(楊輝三角 Lucas定理 模合數)

2021-09-30 12:43:46 字數 1312 閱讀 5428

/*

(1) 1 <= m <= n <= 1000 和 1 <= p <= 10^9 ( p可以是任何數 )

這個問題比較簡單,組合數的計算可以靠 楊輝三角 ,那麼由於和的範圍小,直接兩層迴圈即可。

*/long long c[maxn][maxn];

void comb(int n, int m, int p)

}

/*

1 <= m <= n <= 10^18 和 2 <= p <= 10^5 (p 是素數)

lucas定理

*/long long mod_pow(long long n, long long k, long long p)

long long comb(long long n, long long m, long long p)

return zi * mod_pow(mu, p - 2, p) % p;

}long long lucas(long long n, long long m, long long p)

/* 非遞迴的快速冪取模

long long mod_pow(long long x, long long k, long long mod)

return ans;

}*/

/*

1 <= m,n <= 10^6 和 p <= 10^9 (p不一定是素數)

*/#include#include#includeusing namespace std;

const long long maxn = 500005;

int prime[maxn]; // 第i個素數(從0開始計數)

bool is_prime[maxn+1]; // is_prime[i]為true表示i是素數

int getprime(int n)

}return p;

}long long count(long long x, long long y)

return ret;

}long long mod_pow(long long n, long long k, long long p)

long long solve(long long n, long long m, long long p)

return ans;

}// 打素數表的時候要注意, 最大的素數 要 大於 輸入的n

int main()

return 0;

}

Lucas 組合數取模

組合數取模就是求 cn mmod p cmn modp 的值,當然根據n,m,p n,m p 的取值範圍不同,採取的方法也不一樣。p p 比較大就只能乙個乙個算如 ll c one by one ll n,ll m 組合數乙個乙個算但是不是很大的要預先處理好階乘 數很大需要逆元 typedef lo...

組合數(楊輝三角)

原來組合數和楊輝三角是有關係的 楊輝三角上的每乙個數字都等於它的左上方和右上方的和 除了邊界 第n行,第m個就是,就是c n,m 從0開始 所以以後求楊輝三角或者組合數都可以用到下面的遞推公式 includeconst int n 2000 5 const int mod int 1e9 7 int...

組合數 楊輝三角

不難想到,我們可以用二維陣列來實現。上 include intmain i,j scanf d n for i 1 i n i a i 1 1 for i 2 i n i for i 1 i n i printf n return0 這樣我們實現了楊輝三角。更近一步,我們得到 用遞迴的辦法來實現也可...