zoukankan      html  css  js  c++  java
  • project euler113

    project euler 113

    对于1个数字,如果他数位不减或者不增称为bouncy number,比如1233,33210。统计1~10^100中的bouncy number
     
    思路:分为两种计算

    1.这个数中只出现了一个数字,那么对于i位的数字有9种,故总计有9 * 100种

    2.这个数中至少出现两个数字,分别按位数计算不减的数和不增的数
    以不减的数为例,枚举首数字j和尾数字k(j < k),
    j = a1 <= a2 <= a3 <= a4 <= a5 <= … <= am = k
    令x1 = a2 - a1,x2 = a3 - a2, x3 = a4 - a3, …, xm - 1 = am - am-1。
    x1 + x2 + x3 + … + xm-1 = k - j 解不定方程的解,C(k - j + m - 2, k - j)
    不增的数同理
    import java.util.*;
    import java.io.*;
    import java.math.BigDecimal;
    import java.math.BigInteger;
    
    public class Main {
        BigInteger bi(int x) {
            return BigInteger.valueOf(x);
        }
        BigInteger comb(int n, int m) {
            BigInteger ret = bi(1);
            for (int i = n; i >= n - m + 1; -- i) ret = ret.multiply(bi(i));
            for (int i = 1; i <= m; ++ i) ret = ret.divide(bi(i));
            return ret;
        }
        void solve() {
            int n = 100;
            BigInteger ans = bi(9 * n);
            for (int i = 2; i <= n; ++ i) {
                for (int j = 1; j <= 8; ++ j)
                    for (int k = j + 1; k <= 9; ++ k) {
                        ans = ans.add(comb(k - j + i - 2, k - j));
                    }
            }
            for (int i = 2; i <= n; ++ i) {
                for (int j = 1; j <= 9; ++ j) 
                    for (int k = 0; k <= j - 1; ++ k) {
                        ans = ans.add(comb(j - k + i - 2, j - k));
                    }
            }
            System.out.println(ans);
         }
        FastScanner cin;
        PrintWriter out;
        void run() {
            cin = new FastScanner();
            out = new PrintWriter(System.out);
            solve();
            out.flush();
        }
        class FastScanner {
            BufferedReader br;
            StringTokenizer st;
            boolean hasNext;
            
            public FastScanner() {
                br = new BufferedReader(new InputStreamReader(System.in));
                hasNext = true;
            }
    
    //        public FastScanner(String s) {
    //            try {
    //                br = new BufferedReader(new FileReader(s));
    //            } catch (FileNotFoundException e) {
    //                // TODO Auto-generated catch block
    //                e.printStackTrace();
    //            }
    //            hasNext = true;
    //        }
    
            public String nextToken() {
                while (st == null || !st.hasMoreTokens()) {
                    try {
                        st = new StringTokenizer(br.readLine());
                    } catch (Exception e) {
                        hasNext = false;
                        return "##";
                    }
                }
                return st.nextToken();
            }
            String next = null;
            public boolean hasNext() {
                next = nextToken();
                return hasNext;
            }
            public int nextInt() {
                if (next == null) next = nextToken();
                String more = next;
                next = null;
                return Integer.parseInt(more);
            }
            public long nextLong() {
                return Long.parseLong(nextToken());
            }
    
            public double nextDouble() {
                return Double.parseDouble(nextToken());
            }
        }
        public static void main(String[] args) {
            new Main().run();
        }
    }

     

  • 相关阅读:
    [转载]支付宝钱包手势密码破解实战(root过的手机可直接绕过手势密码)
    记大神的一次反汇编/更新
    关于获取某月某日最后一天时Calendar的cal.getActualMaximum(Calendar.DAY_OF_MONTH)的吐槽
    第一章:shiro简介
    [转] JAVA分为三个体系,JavaSE,JavaEE,JavaME(J2ME)的区别以及各个版
    JVM中GC浅解:垃圾回收的了解
    nginx redirect ignore port 两层nginx跳转忽略了端口
    [复习]java中hashCode的作用
    【转载】java工程师学习之路---给自己的目标
    java中的内部类
  • 原文地址:https://www.cnblogs.com/tempestT/p/7653535.html
Copyright © 2011-2022 走看看