Beakjoon/C#

[beakjoon - C#] 28138번 문제, 재밌는 나머지 연산

homoon 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);
        }
    }
}