• 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;
            
        }
    }
  • 相关阅读:
    2021NUAA暑假集训 Day3 题解
    2021NUAA暑假集训 Day2 题解
    2021NUAA暑期模拟赛部分题解
    CodeForces 1038D Slime
    UVA 11149 Power of Matrix
    UVA 10655 Contemplation! Algebra
    UVA 10689 Yet another Number Sequence
    HDU 4549 M斐波那契数列
    HDU 4990 Reading comprehension
    CodeForces 450B Jzzhu and Sequences
  • 原文地址:https://www.cnblogs.com/CJLHY/p/9220407.html
Copyright © 2020-2023  润新知