본문 바로가기
Computer Science

프양연 CRT / 최대공배수, 최대공약수

by OKOK 2018. 12. 24.

1. 알아야 하는 것 확인

2. 오케이

3. 최대 공배수, 공약수 알면 끝인가?

4. 차이니즈 리마인더 는 무엇?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#define _CRT_SECURE_NO_WARNINGS
 
#include <stdio.h>
 
int N;
long long M[10], R[10];
long long M_multi;
 
void init()
{
    for (int i = 0; i < 10; i++)
    {
        M[i] = R[i] = 0;
    }
    N = 0;
    M_multi = 1;
}
 
void input()
{
    scanf("%d"&N);
 
    for (int i = 0; i < N; i++)
    {
        scanf("%d %d", R + i, M + i);
        M_multi *= M[i];
    }
}
 
long long getY(long long M, long long m)
{
    int a = M % m;
 
    long long i = 1;
    while ((i*a) % m != 1)
    {
        i++;
    }
 
    return i;
}
 
void solve()
{
    long long sum = 0;
    for (int i = 0; i < N; i++)
    {
        long long Mi = M_multi / M[i];
        sum += R[i] * Mi * getY(Mi, M[i]);
        //      printf("Ri : %d\nMi : %d\ngetY : %d\n", R[i], Mi, getY(Mi, M[i]));
    }
 
    long long answer = sum % M_multi;
 
    printf(" %lld", answer);
}
 
int main(void)
{
    freopen("input.txt""r", stdin);
    int test_case;
    int T;
 
    setbuf(stdout, NULL);
    scanf("%d"&T);
 
    for (test_case = 1; test_case <= T; ++test_case)
    {
        printf("#%d", test_case);
 
        init();
        input();
        solve();
 
        printf("\n");
    }
    return 0;
}
 
cs


댓글