元の質問へのリンク:http://acm.hdu.edu.cn/showproblem.php?pid=2058
思考:算術配列改変式:合計= A1 * LEN + LEN *(LEN -1)/ 2
要約この質問一文にアイデアを次のとおりです、列と行の長さと数に応じて、間隔が出てきたので、長さを知って、最初の項を計算することができます(ブログをたくさん読んで、それを明確にしていない、私は大きな一日めまいよ...... )
A1> = 1でlen-1 + 2 SO * A1> LEN(ファジーので、次に式の変形(2 * A1 + LEN -1)* LEN = 2 *和利用できるが、厳密に小さいLEN SQRT(2 *合計)よりもと比較)
その上に二重のOKの使用に関する以下の判断、倍精度のターンは長い間失われているため、まだ等しい、説明が発見された場合はその変換した後、あなたが出力することができます
ソースコード:
パッケージhduoj; インポートjava.util.Scanner; パブリック クラスhdoj_2058 { / ** * Zhushidiao網羅的方法、タイムアウト *算術配列は和の式である= 2 * LEN + LEN( lenの-1) / 2 * / // パブリック静的無効メイン(文字列[] args){ // スキャナスキャナ新しい新しいSC =(System.in); // 一方(真の){ // ロングsc.nextLong N =(); // M = sc.nextLongロング(); // IF(N == 0 == 0 || M)BREAK; // のHashMap <ロング、ロング> =新しい新しい地図のHashMap <>(); // ロングスタート= 0; //// 長い端= 0。 // のために(長いI 1 =、iは<M / 2; ++ I){ // 長い和= I。 // 開始= I; // 長いJ。 // (J = I + 1、J <Math.sqrt(M); ++ j)のための{ // 和+ = J。 // もし(合計== M){ // map.put(、J開始)。 // } // もし(合計> M)ブレーク。 // } // } // IF(map.size()== 0)のSystem.out.println( "[" + M + " "+ M +"]"); // 他に{ // map.put(M、M); // のため(のMap.Entry <長い、長い>それぞれ:map.entrySet()){ // するSystem.out.println( "[" + each.getKey()+」、 "+ each.getValue()+" ]」)。 // } // } // } // } パブリック 静的 ボイドメイン(文字列[]引数){ スキャナSC = 新しいスキャナ(System.in)。 一方、(真){ 長い N = sc.nextLong()。 長い M =sc.nextLong(); IF(N == 0 == 0 || M)BREAK ; ロング LEN =(ロング)Math.sqrt(2 * M)+ 1; // ここではプラス1サイクルが以下のように決定されますない長さが少なくなる場合の条件は、還元なり つつ(LEN - = 1。!){ ロングスタート=(2 M / LEN + 1 * - lenの)/ 2 ; IF((スタート+ 2 * lenは- 1)* LEN / 2 == M){ するSystem.out.println( "["スタート+ + "" +(スタート+ LEN -1)+ "]" ); } } のSystem.out.println(); } } }
コードはACとなっています
私は助けたいです
上記