6 long mul(long a
, long b
, long m
) {
7 long d
= 0, mp2
= m
>> 1;
13 assert(m
< 0x4000000000000000ULL
);
14 assert(a
< m
&& b
< m
);
15 for (i
= 0; i
< 63; i
++) {
16 d
= (d
> mp2
) ? (d
<< 1) - m
: d
<< 1;
17 if (a
& 0x4000000000000000ULL
) d
+= b
;
23 void ext(int a
, int b
, int *m
, int *n
) {
44 int time
, best
, i
, n
= 0, idx
= 0;
47 int prod1
= 1, prod2
= 1, m
;
48 int rem1
= 0, rem2
= 0;
52 while (scanf("%[x0123456789],", c
) > 0) {
57 if ((i
- time
% i
) < (best
- time
% best
))
60 rem
[idx
] = (5 * i
- n
+ 1) % i
;
63 for (i
= 0; i
< idx
; i
++) {
64 int *p
= prod2
< prod1
? &prod2
: &prod1
;
65 int *r
= prod2
< prod1
? &rem2
: &rem1
;
70 ext(*p
, num
[i
], &m
, &n
);
71 *r
= (mul(mul(*r
, n
, *p
* num
[i
]), num
[i
], *p
* num
[i
]) +
72 mul(mul(rem
[i
], m
, *p
* num
[i
]), *p
, *p
* num
[i
])) % (*p
* num
[i
]);
76 ext(prod1
, prod2
, &m
, &n
);
77 res
= mul(mul(rem1
, n
, 1L * prod1
* prod2
), prod2
, 1L * prod1
* prod2
) +
78 mul(mul(rem2
, m
, 1L * prod1
* prod2
), prod1
, 1L * prod1
* prod2
);
79 printf("%d %ld\n", (best
- time
% best
) * best
, res
);