花(唯一分解定理 排列組合 快速冪)

2021-07-23 15:49:24 字數 1467 閱讀 2563

問題描述:

商店裡**n種不同品種的花。為了裝飾桌面,你打算買m支花回家。你覺得放兩支一樣的花很難看,因此每種品種的花最多買1支。求總共有幾種不同的買花的方案?答案可能很大,輸出答案mod p的值。

輸入格式:

一行3個整數n,m,p,意義如題所述。

輸出格式:

乙個整數,表示買花的方案數。

輸入輸出樣例1:

輸入:

4 2 5

輸出:

1輸入輸出樣例1說明

用數字1,2,3,4來表示花的種類的話,4種花裡買各不相同的2支的方案有(1,2)、(1,3)、(1,4)、(2,3)、(2,4)、(3,4),共6種方案,模5後餘數是1。

資料範圍:

對於30%的資料,n,m≤10

對於50%的資料,n,m≤1000

對於80%的資料,1≤m≤n≤50,000

對於100%的資料,1≤m≤n≤1,000,000,p≤1,000,000,000

思路:

組合數裸題,就是要求出c(n,m)%p

由公式得:c(n,m)%p=!n*!m/!(n-m)%p

首先會想到化簡,分子分母能約的約掉,但是剩下的乘起來會爆(資料有點大。。。),這時候取模的話,答案顯然是錯誤的,因為涉及到了除法,所以這種方案不可行!

然後會想到費馬小定理,求出逆元,進而得出答案,顯然當p為合數是無解!

最後無奈,分子分母分解質因數,然後約分,最後計算答案,加剪枝(否則80分,超時!)

#include

#include

#include

#define lon long long

using

namespace

std;

const

int maxn=1000010;

int n,m,p,ans=1,sum,a[maxn],prime[maxn],p[maxn];

bool flag[maxn];

void prepare()

}void work1(int x)

a[i]+=tmp;

}if(x==1) break;

if(!flag[x])//剪枝

}}void work2(int x)

a[i]-=tmp;

}if(x==1) break;

if(!flag[x])//剪枝

}}lon quick_power(lon x,lon y,lon z)//快速冪

return tmp;

}int main()

唯一分解定理

任意乙個大於1的正整數都能表示成若干個質數的乘積,且表示的方法是唯一的。換句話說,乙個數能被唯一地分解成質因數的乘積。因此這個定理又叫做唯一分解定理。c include include include using namespace std int main int num 32 int local...

唯一分解定理

唯一分解定律 又稱為正整數的唯一分解定理,即 每個大於1的自然數均可寫為質數的積,而且這些素因子按大小排列之後,寫法僅有一種方式。當題目有大數相除,求餘數時,精度要求高時.就要運用唯一分解定律 以下唯一分解定律證明 為了真正地證明,分解質因數的方法是唯一的,我們將再次用到反證法。假設存在某些數,它們...

唯一分解定理

problem description 假設x是乙個正整數,它的值不超過65535 即1 x 65535 請編寫乙個程式,將x分解為若干個素數的乘積。input 輸入的第一行含乙個正整數k 1 k 10 表示測試例的個數,後面緊接著k行,每行對應乙個測試例,包含乙個正整數x。output 每個測試例...