洛谷 P1771 方程的解

傳送門

這道題是組合數的知識,就是讓我們求k個正整數加起來等於xx%1000的方案有多少種

由於我們是要找正整數,所以肯定不會有0,所以就把xx%1000用隔板法分成k份,這樣得到就是C(k-1,xx%1000-1)

因爲這個數範圍比較大,所以我們需要高精度處理

AC代碼如下:

#include<bits/stdc++.h>
using namespace std;
int c[100000];
template<typename T> T quick(T a,T b,T p) {
	T ans=1;
	a%=1000;
	while(b) {
		if(b&1)ans=ans*a%p;
		a=a*a%p;
		b>>=1;
	}
	return ans;
}
void comb(int n,int m) { 
	c[1]=1;
	c[0]=1;
	for(int k=1;k<=m;k++)
    {
        for(int i=1;i<=c[0];i++){c[i]*=(n-k+1);}
        for(int i=1;i<=c[0];i++){c[i+1]+=c[i]/10000,c[i]%=10000;}
        while(c[c[0]+1]){c[0]++;}
        for(int i=c[0],y=0;i>=1;i--){y=y*10000+c[i],c[i]=y/k,y%=k;}
        while(!c[c[0]]){c[0]--;}
    }
}
int main() {
	int k,x;
	cin>>k>>x;
	x=quick(x,x,1000);
	comb(x-1,k-1);
	printf("%d",c[c[0]]);     //因爲存在進位後位數不足的原因,直接輸出就會少0
    for(int i=c[0]-1;i>=1;i--){printf("%d%d%d%d",c[i]/1000,c[i]/100%10,c[i]/10%10,c[i]%10);}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章