ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [beakjoon - C#] 28138번 문제, 재밌는 나머지 연산
    Beakjoon/C# 2023. 6. 13. 07:39

    문제 
     - 정수 N을 m으로 나눈 나머지가 R이 되도록 하는 모든 양의 정수 m의 합을 구하라.

    입력
     - 첫째 줄에 정수 N과 R이 공백을 사이에 두고 주어진다. ( 1 <= N <= 10^12, 0 <= R < N )

    출력
     - 정수 N을 m으로 나눈 나머지가 R이 되도록 하는 모든 양의 정수 m의 합을 출력 한다.
     - 조건을 만족하는 m이 없으면 0 을 출력한다.

    풀이
     N = xm + R  =>  xm = N - R  =>  m = (N - R) / x
     (N - R)을 a로 치환 하면
     a 에 대한 약수의 합 구하기가 됨
     합을 구하는 약수(m, 값)는 R(나머지) 보다 커야함

     

    코드

    namespace _28138
    {
        internal class Program
        {
            static void Main(string[] args)
            {
                string[] arr1 = Console.ReadLine().Split();
    
                long sum = 0; // 합계를 담을 변수
                long N = long.Parse(arr1[0]); // 정수 N
                long R = long.Parse(arr1[1]); // 나머지 R
    
                long a = N - R; // 약수를 구해야 하는 a
    
                List<long> list = new List<long>();
    
                for (long x = 1; x <= Math.Sqrt(a); x++)
                {
                    if (a % x == 0)
                    {
                        list.Add(x); // 전반부 약수 저장
                    }
                }
    
                int cnt = list.Count();
                for (int i = 0; i < cnt; i++)
                {
                    list.Add(a / list[i]); // 후반부 약수 저장
                }
    
                // 중복 값 제거 (Distinct())
                // 약수 값이 나머지 보다 큰 것 중에서 (Where(item => item > R)
                // 합계 구하기(Sum())
                sum = list.Distinct().Where(item => item > R).Sum();
    
                Console.WriteLine(sum);
            }
        }
    }

    댓글