1308. 方程的解
x x ( m o d 1000 ) x^x (\mod 1000) xx(mod1000)可以快速幂求出,不是重点。
然后实际上就是求不定方程的正整数解的个数,运用隔板法就可以解决。
最终答案 C n − 1 k − 1 C_{n-1}^{k-1} Cn−1k−1
但是由于不能取模,所以还得要手写高精度。
#include <stdio.h>
using namespace std;
const int N = 150;
int k,x,f[1010][110][N];
int qm(int a,int b,int p){
int res = 1;
while(b){
if(b&1) res = res*a%p;
a = a*a%p;
b >>= 1;
}
return res%p;
}
int add(int *c,int *a, int * b){
int t = 0;
for(int i=0;i<N;i++){
t += a[i]+b[i];
c[i] = t%10;
t /= 10;
}
}
int main(){
scanf("%d%d",&k,&x);
int n = qm(x%1000,x,1000);
// ans = C(n-1,k-1);
for(int i=0;i<n;i++){
for(int j=0;j<=i && j<k;j++){
if(j==0) f[i][0][0] = 1;
else add(f[i][j],f[i-1][j-1],f[i-1][j]);
}
}
int *ans = f[n-1][k-1];
int i = N-1;
while(i>=0 && !ans[i]) i--;
while(i>=0) printf("%d",ans[i--]);
return 0;
}