AcWing 1308. 方程的解 (组合数(不定方程正整数解的个数)、高精度、快速幂)

1308. 方程的解
x x ( m o d    1000 ) x^x (\mod 1000) xx(mod1000)可以快速幂求出,不是重点。
然后实际上就是求不定方程的正整数解的个数,运用隔板法就可以解决。
最终答案 C n − 1 k − 1 C_{n-1}^{k-1} Cn1k1
但是由于不能取模,所以还得要手写高精度。

#include 
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;
}

你可能感兴趣的:(数论,#,组合计数,#,大数)