Codeforces Round #491 (Div. 2) E - Bus Number + 反思

Posted cjlhy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #491 (Div. 2) E - Bus Number + 反思相关的知识,希望对你有一定的参考价值。

E - Bus Number

最近感觉打CF各种车祸。。。。。感觉要反思一下,

上次读错题,这次想当然地以为18!肯定暴了longlong 而没有去实践,

这个题我看到就感觉是枚举每个数字的个数,但是我觉得算得时候会爆longlong

就想用大数,但是我去看别人交的全部都是C++,就感觉是不是有别的方法,

想了半天感觉时间来不及了就强行上了个java,结果时间来不及。。。

以后写题首先要读清楚题目,其次不要想当然,要去实践!!!!!!!!!!! 真的很烦。

import java.math.BigInteger;
import java.util.*;
public class Main {
    static long n;
    static int cnt[] = new int[10];
    static int num[] = new int[10];
    static long f[] = new long[20];
    static long ans = 0;
    static long one = 1000000000;
    static long base =  one * one;
    public static void main(String arg[]) {
        
        f[0] = 1;
        for(int i = 1; i <= 18; i++) {
            f[i] = f[i - 1] * i;
        }
        
        Scanner in = new Scanner(System.in);
        n = in.nextLong();
        if(n == base) {
            System.out.println("18");
        } else {
            while(n > 0) {
                int ret = (int)(n % 10);
                cnt[ret]++;
                n /= 10;
            }
            
            for(int i = 0; i < 10; i++) {
                if(cnt[i] > 0) {
                    num[i] = 1;
                    cnt[i]--;
                }
            }
            
            dfs(0);
            System.out.println(ans);
        }
        in.close();
    }
    
    public static void dfs(int p) {
        //System.out.println("#####");
        ans += cal();
        for(int i = p; i <= 9; i++) {
            if(cnt[i] == 0) continue;
            cnt[i]--;
            num[i]++;
            dfs(i);
            num[i]--;
            cnt[i]++;
        }
    }
    public static long cal() {
        int sum = 0;
        long ans = 0, ret = 0;
        for(int i = 0; i <= 9; i++) sum += num[i];
        ans = f[sum];
        
        for(int i = 0; i <= 9; i++) {
            if(num[i] > 0)ans /= f[num[i]];
        }
            
        
        if(num[0] > 0) {
            ret = f[sum - 1];
            ret /= f[num[0] - 1];
            for(int i = 1; i <= 9; i++) {
                if(num[i] > 0) {
                    ret /= f[num[i]];
                }
            }
        }
        return ans - ret;
        
    }
}

 

以上是关于Codeforces Round #491 (Div. 2) E - Bus Number + 反思的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #491 (Div. 2) E - Bus Number + 反思

Codeforces Round #436 E. Fire(背包dp+输出路径)

[ACM]Codeforces Round #534 (Div. 2)

CodeforcesCodeforces Round #491 (Div. 2) (Contest 991)

Codeforces Round #726 (Div. 2) B. Bad Boy(贪心)

Codeforces 491B. New York Hotel 最远曼哈顿距离