方程的解 LibreOJ - 10231

原题链接
考察:计数dp
思路:
  隔板法的模板题,适用于求n个苹果分给k个盘子,且每个盘子不为0的排列数.
  实际是求\(C_{i-1}^{k-1}\).需要高精

Code

#include <iostream>
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 1010,M = 150;
int n,k,C[N][M][M];
int qsm(int a,int k,int m)
{
    int res = 1;
    while(k)
    {
        if(k&1) res = (LL)res*a%m;
        a = (LL)a*a%m;
        k>>=1;
    }
    return res;
}
void add(int a[],int b[],int c[])
{
    for(int i=0,t=0;i<M;i++)
    {
        t += b[i]+c[i];
        a[i] = t%10;
        t/=10;
    }
}
int main()
{
    scanf("%d%d",&k,&n);
    n = qsm(n,n,1000);//求Cn-1 k-1
    for(int i=0;i<=n;i++)
     for(int j=0;j<=i&&j<=k;j++)
      if(!j) C[i][j][0] = 1;
      else add(C[i][j],C[i-1][j-1],C[i-1][j]);
    int idx = M-1;
    while(idx&&!C[n-1][k-1][idx]) idx--;
    for(int i=idx;i>=0;i--) printf("%d",C[n-1][k-1][i]);
    printf("\n");
    return 0;
}

posted @ 2021-06-10 16:51  acmloser  阅读(29)  评论(0编辑  收藏  举报