zoukankan      html  css  js  c++  java
  • Codeforces Round #491 (Div. 2) E

    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;
            
        }
    }
  • 相关阅读:
    从无到有构建vue实战项目(二)
    从无到有构建vue实战项目(一)
    windows下nginx的安装和使用
    系统全局环境变量设置
    100个常用的linux命令
    Linux常用系统信息查看命令
    linux下搜索find命令拾遗
    linux基础优化
    linux系统基础文件属性
    正则awk和查看文件行数
  • 原文地址:https://www.cnblogs.com/CJLHY/p/9220407.html
Copyright © 2011-2022 走看看