質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

2167閲覧

CodeIQの実力判定Aランク問題でタイムアウトしてしまう。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2017/03/03 07:51

編集2017/03/03 07:59

CodeIQの問題をやっていたのですがタイムアウトしてしまいます。

###問題

問題は以下です。

【問題】
1から1,000,000までの整数の範囲で、連続する2値を合計します。
2値の合計が、整数Nの倍数になる組み合わせを、数えてください。
ただし、整数Nは、2≦N≦1,000 の範囲とします。


整数Nが11の場合、「5, 6(合計は11)」、「16,17(合計は33)」……という組み合わせが、整数Nの倍数になります。
また、連続する2値の最小は「1, 2(合計は3)」、最大は、「999999, 1000000(合計は1999999)」になります。

【入力】
標準入力から、複数行のデータが与えられます。1行のデータが、1つの整数Nになります。

【出力】
1行ずつ処理を行ない、その答えを1行ごと標準出力に出力します。

【入出力サンプル】
Input
307
456
545
165

Output
3257
0
1835
6061

ログインが必要なため、以下より転載
https://codeiq.jp/challenge/3117

###作成したコード

C#

1using System; 2 3public class hoge 4{ 5 static void Main() 6 { 7 string line; 8 int num, count = 0, val = 0; 9 10 for(;(line=Console.ReadLine()) != null;) 11 { 12 if(int.TryParse(line, out num)) 13 { 14 for(int i=1;i<1000000;i++) 15 { 16 val = i + (i+1); 17 val %= num; 18 if(val == 0) 19 count++; 20 } 21 Console.WriteLine(count); 22 } 23 } 24 } 25}

for分で回すのがいけないのかなと思いましたが最適解がよくわかりません。
ヒントの様なものでも構いませんので何か教えてください。。。

###追記
処理制限時間は1秒です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

CodeIQ運営事務局からのお願いと連絡事項

解答送信の有無を問わず、模範解答のネタばれにつながるような各種行為、別人による不正解答は、固くお断り申し上げます。

CodeIQ運営事務局 スキルチェック部さんからの問題より。

との注意があるので、ふんわりとした回答のみにとどめます。

  • 連続する2値にはある縛りがあります。
  • とりあえず最小の組み合わせを探します。

投稿2017/03/03 08:18

can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2017/03/03 08:24

他人から聞けるのも「実力」のうち、かもしれませんが、おおっぴらにやるのは良くないですよね。
退会済みユーザー

退会済みユーザー

2017/03/03 08:25

その様な規約が。。。 ご指摘ありがとうございます。
can110

2017/03/03 08:27

ですね。あと自力でとことん考えたうえで解けたときの快感もあるので。
can110

2017/03/03 08:28

>tottyさん いえいえ^-^
guest

0

ベストアンサー

連続する2つの値ですから、x + (x+1) が N の倍数ですよね。
つまり 2x+1 が N になる値を一つ見つけることができれば、あとは 1000000 までに何回加算できたか分かればよいのでは。

で、2x+1 が N になるということは、変形して 2x = N-1 ですから、x = (N-1)/2 ですよね。
でもって、次の N の倍数を構成する2値のうち小さい方をy とすると、すなわち 2y+1 = 2N ですから、 2y = 2N-1 = N + N-1 より、y = (N/2) + (N-1)/2 です。つまり、y = x + (N/2) になります。
なので、最初の x さえ分かれば、あとは N/2 を足していき、 x<1000000 になるまでの加算回数をカウントするだけでいいのでは。

投稿2017/03/03 08:01

編集2017/03/03 08:09
tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/03/03 08:05

単純な数学の問題のような感じですかね。 数学とか最近まったくなので問題文通りにしかコードをかけていませんでした。。。 ちょっと試してみます。
tacsheaven

2017/03/03 08:13

ちょこちょこ修正しましたが、上のことから、x は計算ですぐ求まります。でもって N/2 (切り捨て) も計算ですぐ分かりますから、(1000000-x)/(N/2) で、何回加算可能かも(実際にループさせなくても)分かりますね。 でもって条件から、最初の N が偶数の場合は 0 に固定されます(Nは奇数でないとそもそも該当する2値が存在しえません)、と。
tacsheaven

2017/03/03 08:50

CodeIQ の場合、こういう「問題から規則性・法則性を見つけ出して えれがんと な解法を書く」問題が多いように思います(w
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問