保证有的数都要有,注意下细节,最后处理下0
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
using namespace std;
char ch[25];
int cnt[15];
long long dp[15][125];
int main() {
while(~scanf("%s",ch))
{
memset(cnt,0,sizeof(cnt));
for(int j=0;j<15;j++)
for(int i=0;i<=122;i++)
dp[j][i]=0;
int len=strlen(ch);
for(int i=0;i<len;i++)
{
int tp=ch[i]-'0';
cnt[tp]++;
}
dp[0][0]=1;
for(int i=1;i<=9;i++)
{
if(cnt[i]==0)
{
for(int j=0;j<=22;j++)
dp[i][j]=dp[i-1][j];
continue;
}
for(int j=22;j>=0;j--)
{
long long sta=1;
for(int k=1;k<=cnt[i];k++)
{
sta=sta*(j+k)/(k);
dp[i][j+k]+=dp[i-1][j]*sta;
}
}
}
int f=9;
if(cnt[0]!=0)
{
f=10;
for(int j=0;j<=22;j++)
{
long long sta=1;
for(int k=1;k<=cnt[0];k++)
{
sta=sta*(j+k-1)/(k);
dp[10][j+k]+=dp[9][j]*sta;
}
}
}
long long ans=0;
for(int i=1;i<=22;i++)
ans+=dp[f][i];
printf("%lld\n",ans);
}
return 0;
}