EOJ 1117 剩余定理
1
/*
2
EOJ 1117 剩余定理
3
4
5
----問題描述:
6
7
求正整數中滿足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], …, X mod a[i] = b[i], … 的最小解。a[i]是一些兩兩互質的正整數。
8
9
10
----輸入:
11
12
輸入數據的第一行為一個正整數T,表示有T組測試數據。
13
每組測試數據的第一行為一個正整數M,表示數組a和b中各有M個元素。0<M<=1000
14
接下來兩行,每行各有M個正整數,分別為a和b中的元素。
15
16
17
----輸出:
18
19
每組輸出占一行,輸出滿足方程組的最小正解X.
20
21
22
----樣例輸入:
23
24
2
25
2
26
2 3
27
0 1
28
3
29
3 5 7
30
2 3 2
31
32
33
----樣例輸出:
34
35
4
36
23
37
38
39
----分析:
40
41
中國剩余定理。
42
43
44
*/
45
46
47
#include <iostream>
48
#include <cstdio>
49
50
using namespace std;
51
52
typedef __int64 Lint;
53
54
template< class T >
55
T gcd( T a, T b ) {
56
T t;
57
while ( 0 != b ) {
58
t = a;
59
a = b;
60
b = t % b;
61
}
62
return a;
63
}
64
65
template< class T, class LT >
66
T gcd_ex( T a, T b, LT &x, LT &y ) {
67
if ( b == 0 ) {
68
x = 1;
69
y = 0;
70
return a;
71
}
72
T d = gcd_ex( b, a % b, x, y );
73
LT t = x;
74
x = y;
75
y = t - ( a / b ) * y;
76
return d;
77
}
78
79
// ax = 1 (mod m)
80
// calc x
81
template< class T >
82
T axm( T a, T m ) {
83
T x, y;
84
if ( 1 == gcd_ex( a, m, x, y ) ) {
85
return x;
86
}
87
return 0;
88
}
89
90
#define K 1009
91
int k;
92
int m[ K ], b[ K ];
93
94
Lint solve() {
95
Lint MM = 1, M[ K ], x = 0;
96
int i;
97
for ( i = 0; i < k; ++i ) {
98
MM *= m[ i ];
99
}
100
for ( i = 0; i < k; ++i ) {
101
M[ i ] = MM / m[ i ];
102
}
103
for ( i = 0; i < k; ++i ) {
104
x += axm( M[ i ], (Lint)m[ i ] ) * M[ i ] * b[ i ];
105
if ( 0 > x ) {
106
x = MM - (-x) % MM;
107
}
108
else {
109
x = x % MM;
110
}
111
}
112
return x;
113
}
114
115
int main() {
116
int tc, i;
117
scanf( "%d", &tc );
118
while ( 0 < tc-- ) {
119
scanf( "%d", &k );
120
for ( i = 0; i < k; ++i ) {
121
scanf( "%d", m+i );
122
}
123
for ( i = 0; i < k; ++i ) {
124
scanf( "%d", b+i );
125
}
126
printf( "%I64d\n", solve() );
127
}
128
return 0;
129
}
130

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

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

posted on 2012-06-01 21:27 coreBugZJ 閱讀(681) 評論(0) 編輯 收藏 引用 所屬分類: ACM 、Algorithm 、Mathematics 、課內作業