bzoj2425 [HAOI2010]计数 组合数

来源:互联网 发布:unity 编写js文件 编辑:程序博客网 时间:2024/05/22 00:53

分部分统计即可,注意0的位置用插板法

使用组合数要区别第一个位置前能不能放


码:

#include<iostream>#include<cstdio>#include<cstring>using namespace std;long long i,j,len,C[59][59],tong[11],lin,fa,ans,tot,k;char str[99];int main(){scanf("%s",str); len=strlen(str);for(i=0;i<len;i++){tong[str[i]-'0']++;}C[0][0]=1;for(i=1;i<=55;i++){C[i][0]=1;for(j=1;j<=55;j++){C[i][j]=C[i-1][j-1]+C[i-1][j];    }}fa=1;for(i=1;i<=9;i++)tot+=tong[i];lin=tot;   for(i=1;i<=9;i++)   fa*=C[lin][tong[i]],lin-=tong[i];for(i=tot;i<len;i++){ans+=fa*C[i-1][i-tot];}for(i=0;i<len;i++){int o=str[i]-'0';for(j=0;j<o;j++){if(!tong[j]||j==0&&i==0)continue;if(j!=0)tong[j]--,tot--;lin=tot;fa=1;   for(k=1;k<=9;k++)   fa*=C[lin][tong[k]],lin-=tong[k];ans+=fa*C[len-i-1][len-i-1-tot];if(j!=0)tong[j]++,tot++;}if(o!=0){tong[o]--;tot--;}}printf("%lld",ans);}



原创粉丝点击