E. Bus Number cf991
Posted lishengkangshidatiancai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了E. Bus Number cf991相关的知识,希望对你有一定的参考价值。
这道题是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); }
以上是关于E. Bus Number cf991的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #491 (Div. 2) E - Bus Number + 反思
CF 1114 E. Arithmetic Progression
Codeforces Round #481 (Div. 3) E. Bus Video System
为啥 Number.MAX_SAFE_INTEGER 是 9,007,199,254,740,991 而不是 9,007,199,254,740,992?