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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Q&A

解決済

1回答

821閲覧

modで最大値を算出,高速化

grape_ll

総合スコア83

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

0グッド

0クリップ

投稿2020/08/24 12:02

下記のリンクでの問題において5つくらいのケースでTLEが起きてしまうのですが,modでの最大値はどのようにすれば早く求めることが出来ますでしょうか.
whileの終了条件があまりよくないのだろうという考えには至るのですが,maxが二週目でも同じであるというやり方以外にどのようなものがありますか?
問題

C

1#include<stdio.h> 2#include<stdlib.h> 3#include<string.h> 4#include<math.h> 5 6 7int main(void){ 8 9 int numG,capacity; 10 11 scanf("%d %d",&numG,&capacity); 12 13 int ans=0; 14 int sum_capa=0; 15 16 if(numG%capacity==0){ 17 printf("0\n"); 18 return 0; 19 } 20 21 while(1){ 22 sum_capa+=capacity; 23 if(sum_capa>=numG) break; 24 } 25 int part=sum_capa-numG; 26 int max=0; 27 int cal=0; 28 while(1){ 29 cal+=part; 30 cal%=capacity; 31 if(max==cal) break; 32 if(max<cal) max=cal; 33 if(max==capacity-1) break; 34 35 36 } 37 printf("%d\n",max); 38 return 0; 39} 40

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

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

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

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

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

guest

回答1

0

ベストアンサー

一次不定方程式の考え方を使うのが1番速いと思います。
xグループ参加し、それに対して必要なバスがy台としたときに、空席がr席(0≦r<M)とすると、
My-Nx=r (A)
という関係が成り立つことになります。
このrとして取りうる値のうち、最大の値を求めるのがこの問題の趣旨となります。

ある値がrとして取りうるか否かは、
方程式(A)を満たす整数x,y(整数解)が存在するか否か、と同義になります。
例えばN=6,M=4の場合、

  • r=3、つまり4y-6x=3を満たす整数x,yは存在しません。(左辺は偶数、右辺は奇数のため)

つまり、「空席が3つ」という状況は起こりえません。

  • r=2、つまり4y-6x=2は、x=1,y=2や、x=3,y=5などが解になります。

これらの状況で、「空席が2つ」になります。

x,yについての方程式(A)は、
rが「MとNの最大公約数」の倍数である場合に、またその場合に限り整数解をもつことが知られています。
一次不定方程式ax+by=cの整数解 - 高校数学の美しい物語
(厳密には、この問題においてx,yは自然数である必要がありますが、
M>0,N>0であれば自然数解をもつことが保証されます。)

以下、「MとNの最大公約数」をgとします。
Mはgの倍数であるため、M = kgとなる自然数kが存在します。
(A)が整数解をもつためにrとして取りうる値は、
0≦r<Mの範囲内にあるgの倍数、すなわち
0, g, 2g, ... , (k-1)g
のk個であり、このうち最大は
(k-1)g = kg - g = M - g
となります。
つまり、求める空席の最大値はM - gで表せることになります。
gは、ユークリッドの互除法により高速に求められるので、総当たりのループより速く解決できます。

投稿2020/08/24 13:23

編集2020/08/25 17:13
swordone

総合スコア20651

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

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

kazuma-s

2020/08/24 16:40 編集

N と M の最大公約数が M の時と、そうでない時とを場合分けしなくてもよいのではありませんか? ということで、 int n, m, g, r; scanf("%d%d", &n, &m); for (g = m; r = n % g; g = r) n = g; printf("%d\n", m - g);
swordone

2020/08/24 17:16

整理し、例を挙げながらの回答に修正しました。
grape_ll

2020/08/29 11:04

このように数学的な面から攻めるとうまくいくのですね.大変参考になりました.説明もとても分かりやすかったです.ありがとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問