方程的解 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;
}