白駿1629.乗算#ジョウサン#
4015 ワード
言語:python 3.9.1
❓ Problem
❓ Problem
白駿1629。乗算#ジョウサン#
📕 フィードバック
1.発展方向
対称性をよく観察し,正しければ再帰関数を用いた一方の値を再利用する.
2.感じる
分かれて治めるのは回帰だ.しかし、この場合、両側が分かれているのではなく、両側に耳を回します.対称だから!!対称の場合、両方に対してマルチ再帰関数を呼び出す必要がない類似の結果が生成されます.つまり繰り返しです.
🚩 Solution
1.方法
TRY 1
powを使います.2%になってタイムアウトしました
TRY 2
分割征服を利用してタイムアウトする.理由powを使用する場合と同じ時間複雑度
TRY 3
left_remain
=right_remain
*a
rightの残りを再取得すれば自然に取れるleft_remain
(対称なので)
TRY 4
でも奇数の場合と偶数の場合では違います!
考えてみれば、奇数の場合は左がN/2+1、偶数の場合は左がN/2です.
そこで、left_remain
偶数と奇数に分けるright_remain
値(再帰的に調べた値)から導出
2.コード
import sys; read = sys.stdin.readline
A, B, C = tuple(map(int, read()[:-1].split(" ")))
def findRemain(a, b):
# 종결조건
if (b==1):
return a%C
else:
right_remain = findRemain(a, b//2); left_remain = right_remain*a if b%2 == 1 else right_remain
return (left_remain*right_remain)%C
print(findRemain(A%C, B))
3.結果
じかんふくごうどぶんせき
O(logB)
Reference
この問題について(白駿1629.乗算#ジョウサン#), 我々は、より多くの情報をここで見つけました
https://velog.io/@tera_geniel/백준-1629.-곱셈
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
1.発展方向
対称性をよく観察し,正しければ再帰関数を用いた一方の値を再利用する.
2.感じる
分かれて治めるのは回帰だ.しかし、この場合、両側が分かれているのではなく、両側に耳を回します.対称だから!!対称の場合、両方に対してマルチ再帰関数を呼び出す必要がない類似の結果が生成されます.つまり繰り返しです.
🚩 Solution
1.方法
TRY 1
powを使います.2%になってタイムアウトしました
TRY 2
分割征服を利用してタイムアウトする.理由powを使用する場合と同じ時間複雑度
TRY 3
left_remain
=right_remain
*a
rightの残りを再取得すれば自然に取れるleft_remain
(対称なので)
TRY 4
でも奇数の場合と偶数の場合では違います!
考えてみれば、奇数の場合は左がN/2+1、偶数の場合は左がN/2です.
そこで、left_remain
偶数と奇数に分けるright_remain
値(再帰的に調べた値)から導出
2.コード
import sys; read = sys.stdin.readline
A, B, C = tuple(map(int, read()[:-1].split(" ")))
def findRemain(a, b):
# 종결조건
if (b==1):
return a%C
else:
right_remain = findRemain(a, b//2); left_remain = right_remain*a if b%2 == 1 else right_remain
return (left_remain*right_remain)%C
print(findRemain(A%C, B))
3.結果
じかんふくごうどぶんせき
O(logB)
Reference
この問題について(白駿1629.乗算#ジョウサン#), 我々は、より多くの情報をここで見つけました
https://velog.io/@tera_geniel/백준-1629.-곱셈
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
import sys; read = sys.stdin.readline
A, B, C = tuple(map(int, read()[:-1].split(" ")))
def findRemain(a, b):
# 종결조건
if (b==1):
return a%C
else:
right_remain = findRemain(a, b//2); left_remain = right_remain*a if b%2 == 1 else right_remain
return (left_remain*right_remain)%C
print(findRemain(A%C, B))
Reference
この問題について(白駿1629.乗算#ジョウサン#), 我々は、より多くの情報をここで見つけました https://velog.io/@tera_geniel/백준-1629.-곱셈テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol