教えて!Gooについて回答とか疑問とか

教えて!Gooについて回答とか疑問とか

二分探索木のパターン数

2010-08-14 10:10:42 | 日記
http://oshiete.goo.ne.jp/qa/6105548.html
について。
以下、f(a,b)は、二分木に追加されていない数字がa個あり、
二分木のうち枝とも葉とも決まっていないノードがb個ある状態と、
そのときの場合の数と定義する。

二分探索木のぱたーん数

根っこが9とおり、
9*f(8,1)--9*2756880=24811920

f(8,1)は2756880
1個ぶらさがるとき8*f(7,1)--8*168210
2個ぶらさがるとき28*f(6,2)--28*50400

f(7,1)は168210
1個ぶらさがるとき7*f(6,1)--7*11970
2個ぶらさがるとき21*f(5,2)--21*4020

f(6,2)は50400
0個ぶらさがるとき1*f(6,1)--1*11970
1個ぶらさがるとき6*f(5,2)--6*4020
2個ぶらさがるとき15*f(4,3)--15*954


f(6,1)は11970
1個ぶらさがるとき6*f(5,1)--6*1020
2個ぶらさがるとき15*f(4,2)--15*390

f(5,2)は4020
0個ぶらさがるとき1*f(5,1)--1*1020
1個ぶらさがるとき5*f(4,2)--5*390
2個ぶらさがるとき10*f(3,3)--10*105

f(4,3)は954
0個ぶらさがるとき1*f(4,2)--1*390
1個ぶらさがるとき4*f(3,3)--4*105
2個ぶらさがるとき6*f(2,4)--6*24

f(5,1)は1020
1個ぶらさがるとき5*f(4,1)--5*108
2個ぶらさがるとき10*f(3,2)--10*48

f(4,2)は390
0個ぶらさがるとき1*f(4,1)--1*108
1個ぶらさがるとき4*f(3,2)--4*48
2個ぶらさがるとき6*f(2,3)--6*15

f(3,3)は105
0個ぶらさがるとき1*f(3,2)--1*48
1個ぶらさがるとき3*f(2,3)--3*15
2個ぶらさがるとき3*f(1,4)--3*4

f(2,4)は24
0個ぶらさがるとき1*f(2,3)--1*15
1個ぶらさがるとき2*f(1,4)--2*4
2個ぶらさがるとき1*f(0,5)--1*1

f(4,1)は108
1個ぶらさがるとき4*f(3,1)--4*15
2個ぶらさがるとき6*f(2,2)--6*8

f(3,2)は48
0個ぶらさがるとき1*f(3,1)--1*15
1個ぶらさがるとき3*f(2,2)--3*8
2個ぶらさがるとき3*f(1,3)--3*3

f(2,3)は15
0個ぶらさがるとき1*f(2,2)--1*8
1個ぶらさがるとき2*f(1,3)--2*3
2個ぶらさがるとき1*f(0,4)--1*1

f(1,4)は4
0個ぶらさがるとき1*f(1,3)--1*3
1個ぶらさがるとき1*f(0,4)--1*1

f(3,1)は15
1個ぶらさがるとき3*f(2,1)--3*3
2個ぶらさがるとき3*f(1,2)--3*2

f(2,2)は8
0個ぶらさがるとき1*f(2,1)--1*3
1個ぶらさがるとき2*f(1,2)--2*2
2個ぶらさがるとき1*f(0,3)--1*1

f(1,3)は3
0個ぶらさがるとき1*f(1,2)--1*2
1個ぶらさがるとき1*f(0,3)--1*1

f(2,1)は3
1個ぶらさがるとき2*f(1,1)--2*1
2個ぶらさがるとき1*f(0,2)--1*1

f(1,2)は2
0個ぶらさがるとき1*f(1,1)--1*1
1個ぶらさがるとき1*f(0,2)--1*1

f(1,1)は1
1個ぶらさがるとき1*f(0,1)--1*1

QA5816775 硬貨の最小枚数の問題

2010-04-13 09:21:37 | 日記
http://oshiete1.goo.ne.jp/qa5816775.html <br>
実際に組んで見ましょうか。 <br>
実行結果は以下の通り、時間は1秒もかかりませんでした。

金額を1つ指定してください
1234567
結果 1234567円の場合 32円硬貨 38576枚、25円硬貨 5枚、10円硬貨 1枚、1円硬貨 0枚、総計 38582枚


<pre>
package coin;

public class Coin5816775 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        long    price_total;
        String    strKingaku    =    "1000";
        // 金額は?
        if(args.length    != 1){
            System.out.println("金額を1つ指定してください");
                java.io.BufferedReader br =
                new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
                try{
                    strKingaku = br.readLine();
                }catch(Exception ex){
                    System.out.println(ex.getStackTrace().toString());
                    return;
                }
        }else{
            strKingaku    =    args[0];
        }
        try{
            price_total    =    Long.parseLong(strKingaku);
        }catch(Exception ex){
            System.out.println(ex.getStackTrace().toString());
            return;
        }
       
        long    lp_32;        //
        long    lp_25;        //
        long    min_32;        //調べる範囲:最小:32円
        long    min_25;        //調べる範囲:最小:25円
        long    max_32;        //調べる範囲:最大:32円
        long    max_25;        //調べる範囲:最大:25円
        long    lp_10;        //
        long    lp_01;        //
        long    wk_price;    //金額作業用
        long    maisu_wk;    //枚数作業用
        long    maisu_min    =    price_total;    //最低枚数=すべて1円硬貨より大きくは無い
        String    strUchiwake    =    "";
        //現在あまっているお金
        wk_price    =    price_total;
        max_32        =    (long)(Math.floor(wk_price        /    32));
        min_32        =    Math.max(0L, max_32    -    83);
        //32円硬貨
        for(lp_32    =    min_32; lp_32    <=    max_32;    lp_32++){
            //残りいくら?           
            wk_price    =    price_total        -    lp_32    *    32;
            max_25        =    (long)(Math.floor(wk_price        /    25));
            min_25        =    Math.max(0L, max_25    - 6);
            //25円硬貨
            for(lp_25    =    min_25; lp_25    <=    max_25;    lp_25++){
                wk_price    =    price_total        -    lp_32    *    32
                                                -    lp_25    *    25;
                //10円と1円は計算で出せる
                lp_10        =    (long)(Math.floor(wk_price    /    10));
                lp_01        =    wk_price    %    10;
                //合計枚数
                maisu_wk    =    lp_32    +    lp_25    +    lp_10    +    lp_01;
                if(maisu_wk    <    maisu_min){
                    maisu_min    =    maisu_wk;
                    strUchiwake    =    "結果 "        +    price_total    +    "円の場合 "
                                +    "32円硬貨 "    +    lp_32    +"枚、"
                                +    "25円硬貨 "    +    lp_25    +"枚、"
                                +    "10円硬貨 "    +    lp_10    +"枚、"
                                +    "1円硬貨 "        +    lp_01    +"枚、"
                                +    "総計 "        +    maisu_min    +"枚";
                }

            }

        }
        System.out.println(strUchiwake);
       

    }

}

</pre>

qa5752707 確率 について

2010-03-15 16:11:10 | 日記
qa5752707 確率
こんなプログラムを書いてみました。
実行結果も示します。


(2)回目の試行後
(0)=847660528
(16)=124692750
(17)=244296000
(18)=263381625
(19)=143071500
(20)=30045015
(40)=42173638
確率(千分率):49

(3)回目の試行後
(0)=1076017653276847424
(22)=30545324589780000
(23)=82860786328320000
(24)=111864923974732500
(25)=85643950494960000
(26)=38287113096053250
(27)=10271284971948000
(28)=1688428190699250
(29)=151390821582000
(30)=5550996791340
(40)=714698899811981084
確率(千分率):664


package test;

import java.math.BigInteger;

public class QA5752707 {

  /**
   * @param args
   */
  public static void main(String[] args) {
    // 現在の状態
    java.math.BigInteger[] mx =  new java.math.BigInteger[42];
    // 試行後の状態
    java.math.BigInteger[] mnext  =  new java.math.BigInteger[42];
    //まず初期化
    for(int i=0;i<41;i++){       mnext[i]  =  BigInteger.ZERO;
    }
    mnext[10]  =  BigInteger.ONE;
    mnext[0]  =  BigInteger.ONE;
    //計算用ワーク
    java.math.BigInteger ret;
    int   addidx;
    //何回か繰り返す
    for(int kaisu  =  2;kaisu<5;kaisu++){       for(int i=0;i<41;i++){         mnext[i]  =  BigInteger.ZERO;
      }
      //現在の状態から、試行後の状態を計算
      for(int i = 10; i < 41; i++){      
        if(mx[i]    != BigInteger.ZERO){
          //10枚中印の付いたカードが0枚~10枚
          for(int xx = 0; xx <= 10; xx++){
            //5枚以上印が付いていないなら
            if(xx < 5 && i < 35){
              //印の付いたカードが(10-x)枚増える
              addidx =  i  +  10 -  xx;
            }else{
              addidx =  40;
            }
            //遷移後の確率を計算
            //整数演算するために、10C40倍する
            if(i  != 40){
              ret   =  mx[i].multiply(ccom(i,xx));
              ret   =  ret.multiply(ccom(40-i,10-xx));
            }else{
              ret   =  mx[i].multiply(ccom(40,10));
            }
            //ret    =  ret.divide(ccom(40,10));
            //試行後の値を加算
            mnext[addidx]  =  mnext[addidx].add(ret);
            //合計を加算
            mnext[0]    =  mnext[0].add(ret);
          }
        }
      }
      System.out.println("(" + kaisu + ")回目の試行後");
      for(int i = 0; i < 41; i++){      
        if(mnext[i]   != BigInteger.ZERO){
          System.out.println("("+i+")="+mnext[i].toString());
        }
      }
      ret   =  mnext[40].multiply(BigInteger.valueOf(1000)).divide(mnext[0]);
      System.out.println("確率(千分率):" + ret.toString());
      System.out.println("");

    }
    
  }
  /**
   * 組み合わせを計算する
   * @param a   
   * @param m   
   *     異なる a 個のものから異なる m 個のものを選ぶ
   * @return
   *     組み合わせ数      
   */
  public static BigInteger  ccom(long a,long m){
    java.math.BigInteger ret  = factorial2(BigInteger.valueOf(a)) ;
    ret=ret.divide(factorial2(BigInteger.valueOf(m)));
    ret=ret.divide(factorial2(BigInteger.valueOf(a-m)));
    return ret;
    
    
  }
  /**
   * 階乗を計算する。
   * @param  val  階乗を計算する値
   * @return  val!
   */
  public static BigInteger factorial2(BigInteger val) {
    if (val.compareTo(BigInteger.ONE) <= 0) {
      // val が 1以下になったら再帰呼び出しを終了する。
      return BigInteger.ONE;
    } else {
      // val * (val - 1)!
      return val.multiply(factorial2(val.subtract(BigInteger.ONE)));
    }
  }

}

食塩水の濃度計算です 質問番号:5437377

2009-11-10 20:12:07 | 日記
http://oshiete1.goo.ne.jp/kotaeru.php3?q=5437377

濃度0.9%の食塩水400gに含まれる食塩の量は何g?
==>400*0.9%=3.6g
食塩をさらに12g加えたのだから、食塩水に含まれる食塩の量は合計で何g?
==>3.6g+12g=15.6g
また、現在の食塩水の重さは何g?
==>400g+12g=412g
上記の食塩で濃度3%になるのだから、食塩水の重さは何g?
==>15.6/3%=520g
よって加えるべき蒸留水の量は、520g-412g=108g

「数列の問題です^^;手も足も…でないです。」について

2009-11-04 22:29:27 | 日記
http://oshiete1.goo.ne.jp/kotaeru_reply.php3?q=5422308
について。
a1=2,b1=1,a(n+1)=1-1/(an)^2,b(n+1)=1-(bn)^2/(an)^2で定める。b2,b99を定めよ。

a1=2,b1=1,
a(n+1)=1-1/(an)^2
b(n+1)=1-(bn)^2/(an)^2


a1=2,b1=1,
a(2)=1-1/(a1)^2=1-1/(2)^2=1-1/4=3/4
b(2)=1-(b1)^2/(a1)^2=1-(1)^2/(2)^2=1-1/4=3/4
a(3)=1-1/(9/16)=1-16/9=-7/9
b(3)=1-(9/16)/(9/16)=0
a(4)=1-1/(49/81)=1-81/49=-32/49
b(4)=1-0/x=1
b(5)とa(5)が同じになり、b(6)が0になるのだから、b(7)が1になる。
よってb(3k)の一般項は0