2016-12-04 7 views
-3

私はこの質問のために書いたコードはほんの少数のテストケースを通過します。私はこれを最適化するのに助けが必要です。テストケースがほとんど通過しませんでした。なぜ全部ではない?

質問:

マーモット、非常に奇妙な生き物がボールを食べます。毎晩、彼は赤と白のボールを食べる。したがって、夕食は、いくつかのボールのシーケンスとして表現することができ、そのうちのいくつかは白で、いくつかは赤で表示されます。しかし、夕食をおいしくするには、制約があります.Marmotは、サイズKのグループでのみ白いボールを食べたいと考えています。今では、「AとBのボールの間でマーモットが何通り食べることができるか」を見つける必要があります。答えは1000000007を法とする非常に大きな印刷が可能です。

入力

最初の行は、二つの整数、t及びtはテストケースの数を表し、K(1 < = T、K < = 105)を含みます。次のt行は、テストケースを記述する2つの整数AおよびB(1 < = A < = B < = 105)を含む。

出力

t行を出力すると、すべてのテストケースに対して1行で答えることができます。

サンプルテストケース

入力

1~3

出力

説明 R - W>レッドボール - >長さ1及びK = 2マーモットが食べることができる®長さ2及びK = 2の場合マーモットが食べることができる白色ボール( RR)および(WW)長さ3およびK = 2の場合、マーモットは(RRR)、(RWW)および(WWR)を食べることができる。

import java.util.Scanner; 

public class Source { 

//Did not use recursive call, as I thought that would increase the running time 
public static int factorial(int n) { 
    int i,f = 1; 
    for(i=1;i<=n;i++) { 
     f *= i; 
    } 
    return f; 
} 

public static int arrange(int m, int n, int k){ 

    // m is total length of balls 
    // n is no. of packets of white balls 
    // k is size of each packet 

    int r,p,arrange; 
    r = m-(n*k); // r - no. of red balls 
    p = n+r; // p - no. of items to be shuffled 
    arrange = factorial(p)/factorial(r)/factorial(n); 
    return arrange; 
} 

public static void main(String args[]){ 

    int i,j,l,t=0,k=0,A=-1,B=-1,q,ansforj,answer,arrans; 

    Scanner sc = new Scanner(System.in); 

    if (sc.hasNextInt()) 
     t = sc.nextInt(); 
    if (sc.hasNextInt()) 
     k = sc.nextInt(); 

    for(i=0;i<t;i++){ 
     answer=0; 
     if (sc.hasNextInt()) 
      A = sc.nextInt(); 
     if (sc.hasNextInt()) 
      B = sc.nextInt(); 
     for(j=A;j<=B;j++){ 
      q = j/k; 
      ansforj=0; 
      for(l=0;l<=q;l++){ 
       arrans = arrange(j,l,k); 
       ansforj = ansforj + arrans; 
      } 
      answer = answer + ansforj; 
      answer = answer % 1000000007; 
     } 
     System.out.println(answer); 
     } 
    sc.close(); 
} 

} 
+1

ようこそ!デバッガの使い方を学ぶ必要があるようです。 [補完的なデバッグ手法](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)にご協力ください。その後も問題が残っている場合は、もう少し詳しくお聞かせください。 –

+0

また、 'mはボールの総長さです'というコメントがあるときは、変数の名前を間違えています。 'totalLengthOfBalls'のように便利な名前をつけるべきです。 –

+0

どのように4 4(正確に4つのボール)の答えは5ですか? (WWWW)(2つの白いボールが2つのグループに連続している)が有効な答えですか? –

答えて

0

ここでは、プログラムが正常に動作しない理由を考え始めるためのいくつかのテスト例を示します。私はK = 1を使用します。私が正しく理解すれば、これは食事の制限なしと同じでなければなりません。だから、bボールの食事のためには、それぞれのボールが赤や白​​になる可能性があるので、2^bの可能性があります。

入力:スタックオーバーフローへ

3 1 
12 12 
13 13 
34 34 

の予想される出力

4096 
8192 
179869065 

実際の出力

4096 
2538 
Exception in thread "main" java.lang.ArithmeticException:/by zero 
    at Source.arrange(Source.java:26) 
    at Source.main(Source.java:51) 
+0

@ Ole.V.V。、私は長い間使ってみました。まだ働いていません。これで私を助けてくれますか?ありがとうございます。 –

+0

私はそれについて考えてきましたが、進める最良の方法についての最終意見には至っていません。 'long 'は19桁(10進数)のように保存されていますが、まだ166桁からかなり離れています。私は2つの選択肢を考えています:(1)1000000007モジュロの結果しか必要ないという事実を利用するよりスマートな方法で階乗の除算の計算を行います。(2) 'BigInteger'を使用する。おそらく、私が考えていないもっと多くの選択肢があります。 –

+0

私は、 'arrange()'が返す必要がある最大数が105であると信じています!/53!/52!それは 'ロング'に収まらない。モジュロ1000000007の操作をしない限り。 –

関連する問題