题目链接:http://codeforces.com/contest/991/problem/E
有重复问题的全排列是
然后我们只要减去开头为0的全拍列就好了。
dfs是搜索每个数字有多少个
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll fac[25];
void init()
{
fac[1]=fac[0]=1;
for(ll i=2;i<20;i++)
fac[i]=i*fac[i-1];
}
int num[15];
ll ans;
int a[15];
void dfs(int x)
{
if(x>9)
{
ll mul=1;
int sum=0;
for(int i=0;i<=9;i++)
mul*=fac[a[i]],sum+=a[i];
mul=fac[sum]/mul;
ll dec=1;
if(a[0])
{
dec=fac[a[0]-1];
for(int i=1;i<=9;i++)
dec*=fac[a[i]];
dec=fac[sum-1]/dec;
mul-=dec;
}
ans+=mul;
return ;
}
for(int i=1;i<=num[x];i++)
{
a[x]=i;
dfs(x+1);
}
if(!num[x])
dfs(x+1);
}
int main()
{
init();
ll n;
scanf("%lld",&n);
int len=0;
while(n)
{
num[n%10]++;
n/=10;
}
dfs(0);
printf("%lld\n",ans);
return 0;
}