#include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #define MM 100003 #define MP 39452 //2^32 mod MM #define MR 20360 typedef union NUM { struct { unsigned int Lo; unsigned int Hi; }; unsigned long long U; } NUM; unsigned int Mod(NUM* pNum) { NUM M; while (pNum->Hi || (pNum->Lo >= MM)) { M.U = pNum->U -= MM; M.U >>= 16; M.U += (M.U>>16)*MR; M.U >>= 1; pNum->U -= M.U * MM; } return pNum->Lo; } //Calculate X = Y^-1 mod MM, that (X*Y) mod MM == 1 unsigned int RMod(unsigned int Y) { unsigned int f, f1=1, f2=MM-1, r, r1=Y, r2=MM-Y; for (;;) { if (r2 > r1) { f = f1; r = r1; while (r2 > (r+r)) { f<<=1; r<<=1; if (f >= MM) f -= MM; } if (f2 >= f) f2 -= f; else f2 += MM - f; if ((r2 -= r) < 2) return f2; } else if (r1 > r2) { f = f2; r = r2; while (r1 > (r+r)) { f<<=1; r<<=1; if (f >= MM) f -= MM; } if (f1 >= f) f1 -= f; else f1 += MM - f; if ((r1 -= r) < 2) return f1; } else { break; } } return f1; } //Calculate (A choose B) mod MM, with a,b < MM unsigned int CMod(unsigned int A, unsigned int B) { unsigned int m,n; NUM P,Q,M; if ((A-B) < B) B = A-B; if (B == 0) return 1; P.U = 1; Q.U = 1; while (B > 0) { P.U *= A; Q.U *= B; Mod(&P); Mod(&Q); A--; B--; } m = RMod(Q.Lo); P.U *= m; Mod(&P); m = P.Lo; return m; } void MReduce(NUM* pNum, unsigned int *p0, unsigned int* p1, unsigned int* p2) { NUM M,P=*pNum, Q; M.U = 0; while (P.Hi || (P.Lo >= MM)) { Q.U = P.U -= MM; M.U ++; Q.U >>= 16; Q.U += (Q.U>>16)*MR; Q.U >>= 1; M.U += Q.U; P.U -= Q.U * MM; } *p0 = P.Lo; P.U = 0; while (M.Hi || (M.Lo >= MM)) { Q.U = M.U -= MM; P.U ++; Q.U >>= 16; Q.U += (Q.U>>16)*MR; Q.U >>= 1; P.U += Q.U; M.U -= Q.U * MM; } *p1 = M.Lo; *p2 = P.Lo; } int main() { /* Enter your code here. Read input from STDIN. Print output to STDOUT */ unsigned int T,m; unsigned int a0, a1, a2, b0, b1, b2; NUM N,K; NUM P,Q; N.U = K.U = 0llu; scanf("%d\n", &T); while (T-- > 0) { scanf("%llu %llu\n", &(N.U), &(K.U)); if (N.U < K.U) {printf("0\n"); continue;} //We are to calculate C(N-K+1, K) mod 100003; N.U -= K.U; N.U ++; if (N.U < K.U) {printf("0\n"); continue;} MReduce(&N, &a0, &a1, &a2); //printf("Reduced to %d %d %d\n", a2, a1, a0); MReduce(&K, &b0, &b1, &b2); //printf("Reduced to %d %d %d\n", b2, b1, b0); if ((b0>a0) || (b1>a1) || (b2>a2)) {printf("0\n"); continue;} P.Lo = CMod(a0, b0); P.Hi = 0; if ((m = CMod(a1, b1)) > 1) {P.U *= m; Mod(&P);} if ((m = CMod(a2, b2)) > 1) {P.U *= m; Mod(&P);} printf("%d\n", P.Lo); } return 0; }