傳送門
這道題是組合數的知識,就是讓我們求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;
}