組合數取模 數論

2022-05-07 03:57:08 字數 1857 閱讀 8159

本人水平有限,題解不到為處,請多多諒解

本蒟蒻謝謝大家**

題目:time limit: 1 sec  memory limit: 128 mb

submit: 113  solved: 39

[submit][status][web board]

給出n,m,p,求c(n,m) mod p

1<=m<=n<=10^6,1<=p<=10^5,p可能為合數

一行給出n,m,p

如題

5 2 3
1
如果直接用公式暴力的話,顯然會爆出long long型別,直接re。

所以要優化,我們可以利用組合數公式來進一步推倒。

我們可以將n!寫成幾個質數冪的積的形式。再利用逆元不斷取模即可。

我們可以先

把能約的先約掉

,直接指數相減即可。

例如:5!=1*2*3*4*5可以寫成:(2^3)*(3^1)*(5^1)又可以寫成:(2^3)%p*(3^1)%p*(5^1)%p即可

我們可以先用尤拉線篩求出質數,再把質數進行求其指數,最後用快速冪還原成常數即可。

在上**之前先來解釋一下我的變數:

isprime表示質數的順序。例如:2為所有質數的第乙個,所以isprime[2]==1

3為所有質數的第二個,所以isprime[3]==2……

primenum表示在n以內有多少個質數。例如:當n==10時,primenum[10]==4因為10以內有4個質數。

sum表示當前質數的指數為多少。例如:2^3 為sum[2]==3

code:

1 #include2

#pragma gcc optimize(3)

3#define int long long

4const

int n=1e6+10;5

using

namespace

std;

6int

n,m,p;

7int

isprime[n],primenum[n],sum[n];

8bool

vis[n];

9int ans=1;10

int tot=0;11

void

inint()

15 inline int

read()

18while(isdigit(ch))

19return x*f;20}

21 inline void write(int

x)22

27int quick_mi(int a,int

b)32

void prime(int

x)39

for(int j=1;j<=tot&&i*isprime[j]<=x;j++)43}

44return;45

}46void solve(int x,int y,int z,int

mod)53}

54for(int i=1;i<=primenum[y];i++)60}

61for(int i=1;i<=primenum[z];i++)67}

68for(int i=1;i<=primenum[x];i++)

72return;73

}74signed main()

75

石頭剪刀布 組合數取模,數論

a和b在玩石頭剪刀布的遊戲 0代表石頭,1代表剪刀,2代表布 他們進行了n場遊戲,現在a知道b每場的情況,贏一場得一分,輸和平不得分,問a最終得分為s的情況有多少種?第一行輸入n和s,n表示進行n場遊戲,s表示a的得分。1 n,s 105 1 n,s 105 第二行輸入n個數 0,1,2 表示b每場...

數論之組合數取模

組合數取模 cm n p 三個鏈結表示的是該種方法的定理定義之類的 怕三種方法合在一起太長 一 楊輝三角打表求組合數 1 m n 1000,1 p 109 int combination int n return 0 二 乘法逆元來直接求組合數 n,m不大於10 5 其中三種求逆元方法及模板請戳藍 ...

方程(1)(數論 組合數)

description 求關於x1,x2,xn 的方程 x1 x2 xn k 的非負整數解的個數。input 僅一行,包含 個正整數n,k。output 乙個整數,表示方程不同解的個數,這個數可能很大,你只需輸出mod 20080814的結果。分析 這其實是乙個組合數的模型 有n種元素,每種元素可不...