根据kummer定理,我们只需要dp出
n−m
在
p
进制下退了几次位。
#include<cstdio>
#include<algorithm>
using namespace std;
#define LL long long
LL a[100],dp[100][100][2],n,p;
int l;
void solve()
{
LL nn,now=0;
scanf("%lld%lld",&n,&p);
l=0;
nn=n;
while (nn)
{
a[++l]=nn%p;
nn/=p;
}
dp[0][0][0]=1;
for (int i=1;i<=l;i++)
for (int j=0;j<=i;j++)
{
dp[i][j][0]=dp[i-1][j][0]*(a[i]+1)+(j?dp[i-1][j-1][1]*a[i]:0);
dp[i][j][1]=dp[i-1][j][0]*(p-a[i]-1)+(j?dp[i-1][j-1][1]*(p-a[i]):0);
}
for (int i=0;now<n+1;now+=dp[l][i++][0])
printf("%lld ",dp[l][i][0]);
putchar('\n');
}
int main()
{
//freopen("e.in","r",stdin);
int T;
scanf("%d",&T);
while (T--) solve();
}