这道题是dfs统计0到9各自能去多少次,再用组合公式计算
和cf1036 C. Classy Numbers有点像
还有一个规律,统计一个不连续的区间里面有多少个数字在区间L,R内,用公式upper_bound(R)-lower_bound(L)这样在区间内没有数字的情况返回0,而其他的公式都会出现一些差错
#include<bits/stdc++.h> using namespace std; typedef long long ll; int num[10]; ll tmpnum[10]; ll jc[22]; ll ans=0; void dfs(int step) { if(step==10) { ll cnt=0; for(int i=0;i<=9;i++) cnt+=tmpnum[i]; ll tmp=jc[cnt]; for(int i=0;i<=9;i++) tmp/=jc[ tmpnum[i] ]; if(tmpnum[0]==0) ans+=tmp; else { ll tmp2=tmpnum[0]*jc[cnt-1]; //tmpnum[0]--;这里不能随意改变以前结果 for(int i=0;i<=9;i++) tmp2/=jc[ tmpnum[i] ]; ans+=(tmp-tmp2); } return ; } for(int i=1;i<=num[step];i++) { tmpnum[step]=i; dfs(step+1); } if(num[step]==0) dfs(step+1); } int main() { string s; cin>>s; jc[0]=1; for(int i=1;i<=20;i++) jc[i]=jc[i-1]*i; for(int i=0;s[i];i++) { num[s[i]-'0']++; } dfs(0); printf("%lld ",ans); }