問題描述:
商店裡**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 每個測試例...