zoukankan      html  css  js  c++  java
  • Bus Number【多重集合的排列】

    题意:

    题目链接:https://codeforces.com/problemset/problem/991/E

    分析:

    多重集合的排列计数,要去掉有前导 (0) 的情况。
    套用多重集合的排列的公式:

    [ans=frac{n!}{n_1!*n_2!*...*n_k!} ]

    采用的递归的方式写,枚举每种数字可能出现的个数。

    代码:

    #include <bits/stdc++.h>
    
    using namespace std;
    typedef long long ll;
    int num[10],d[10];
    ll f[20],ans;
    void init()
    {
        f[0]=1;
        for(int i=1;i<=19;i++)//预处理到19,一开始到18,WA了
            f[i]=f[i-1]*i;
    }
    void dfs(int n,int m)
    {
        if(n==10)
        {
            ll res=f[m],t=0;
            for(int i=0;i<=9;i++)
                res/=f[d[i]];
            if(d[0]>0)
            {
                t=f[m-1];
                t/=f[d[0]-1];
                for(int i=1;i<=9;i++)
                    t/=f[d[i]];
            }
            ans+=(res-t);
            return;
        }
        if(num[n]>0)
        {
            for(int i=1;i<=num[n];i++)
            {
                d[n]=i;
                dfs(n+1,m+i);
                d[n]=0;
            }
        }
        else
        {
            d[n]=0;
            dfs(n+1,m);
        }
    }
    int main()
    {
        init();
        ll n;
        ans=0;
        scanf("%lld",&n);
        while(n)
        {
            num[n%10]++;
            n/=10;
        }
        dfs(0,0);
        printf("%lld
    ",ans);
        return 0;
    }
    
    
  • 相关阅读:
    Javabean(MAX)
    电梯时间计算
    FT232R USB UART驱动安装
    java多态
    php文件上传代码
    $_FILES ERROR
    17
    php伪静态
    我的博客开通了!
    【省选划水记】我确实是在划水。
  • 原文地址:https://www.cnblogs.com/1024-xzx/p/13262401.html
Copyright © 2011-2022 走看看