해달
2020. 6. 22. 08:00
복기
해당 문제는 ‘중국인의 나머지 정리’를 이용하면 더 빠르게 풀 수 있다.
코드
#include <stdio.h> int main() { int E, S, M; scanf("%d %d %d", &E, &S, &M); // 구하고자 하는 수 x는 // x = 15a + 1 = 28b + 1 = 19c + 1이다. // 계산의 편의성을 위해 1을 빼준다. --E; --S; --M; // 정답을 구할 때까지 반복한다. int ans = E; while (!(ans % 28 == S && ans % 19 == M)) ans += 15; // 지금까지 구한 수는 x - 1이므로 ans에 1을 더해 출력한다. printf("%d", ans + 1); } |
using System; using System.Collections.Generic; using System.Security.Cryptography.X509Certificates; namespace Csharp { class Program { static void Main(string[] args) { var inputs = Console.ReadLine().Split(); int E = Convert.ToInt32(inputs[0]); int S = Convert.ToInt32(inputs[1]); int M = Convert.ToInt32(inputs[2]); // 중국인의 나머지 정리를 이용하면 // 28 * 19 * s1 % 15 == 1 // 15 * 19 * s2 % 28 == 1 // 15 * 28 * s3 % 19 == 1 // s1 == 13, s2 == 17, s3 == 10 // ans = (E * 28 * 19 * 13 + S * 15 * 19 * 17 + M * 15 * 28 * 10) % (15 * 28 * 19) // = (E * 6916 + S * 4845 + M * 4200) % 7980 int ans = (E * 6916 + S * 4845 + M * 4200) % 7980; Console.WriteLine((ans != 0) ? ans : 7980); } } } |
from sys import stdin input = stdin.readline E, S, M = map(int, input().split()) ans = (E * 6916 + S * 4845 + M * 4200) % 7980 print((ans if ans != 0 else 7980)) |