本人水平有限,題解不到為處,請多多諒解
本蒟蒻謝謝大家**
題目: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種元素,每種元素可不...