#include <stdio.h>
#include <string.h>
#include <math.h>
#include <bitset>
using namespace std;
bitset<50003> A;
unsigned int P[3401];
char buffer[8192];
int ind = 0;
inline void flush()
{
fputs(buffer,stdout);
ind = 0;
}
static char sbuf[12] = {0,0,0,0,0,0,0,0,0,0,'\n',0};
inline char * itoa(unsigned int _a, unsigned int & _len)
{
char *pos = sbuf + 10;
do
{
*--pos = '0' + (_a%10);
_a/=10;
} while(_a);
_len = sbuf+11-pos;
return pos;
}
inline void bufwrite(unsigned int _a)
{
char *s = 0;
unsigned int len;
s = itoa(_a, len);
strcpy(buffer+ind, s);
ind+=len;
if(ind>8000)
flush();
}
inline bool print_from_array(unsigned int _m, unsigned int _n)
{
if(_m > 31607) return true;
if(_n < 2) return false;
if(_m <= 2) {bufwrite(2); _m=2;}
if(_n > 2)
{
unsigned int i = 0;
for(i = 0; i < 3400; i++)
{
if((P[i] >= _m) && (P[i] <= _n))
bufwrite(P[i]);
else if(P[i] >= _n) return false;
}
}
else
return false;
return true;
}
void precalc()
{
unsigned int pp = 3, i = 0, j;
for(; pp <= 178; pp+=2, i++)
if(!A[i])
for(j = i+pp; j <= 15802; j+=pp)
A[j] = true; // not a prime
for(i = 0, j = 0; i <= 15802; i++)
if(!A[i]) P[j++] = (i<<1) + 3;
P[3400] = 100000;
A.reset();
}
void print_primes(unsigned int _m, unsigned int _n)
{
if(!print_from_array(_m, _n)) {flush();return;}
if(_m<=31607) _m = 31627;
unsigned int max = (unsigned int) sqrt((double)_n) +1, c, p=3, i=0, j, k;
for(; max >= P[i]; p = P[++i])
{
c = (unsigned int) ceil((double)_m/p)*p;
if(!(c&1)) c+=p;
for(j = c, k = (c-_m)/2; j <= _n; j += 2*p, k += p)
A[k] = true;
}
p = _m&1 ? _m : _m+1;
for(i = 0; p <= _n; p+=2, i++)
if(!A[i]) bufwrite(p);
flush();
A.reset();
}
int main()
{
unsigned int t=0, m=0, n=0;
scanf("%u", &t);
precalc();
while(t--)
{
scanf("%u %u", &m, &n);
print_primes(m, n);
puts("");
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGUgPGJpdHNldD4KIAp1c2luZyBuYW1lc3BhY2Ugc3RkOwogCmJpdHNldDw1MDAwMz4gQTsKdW5zaWduZWQgaW50IFBbMzQwMV07CmNoYXIgYnVmZmVyWzgxOTJdOwppbnQgaW5kID0gMDsKIAppbmxpbmUgdm9pZCBmbHVzaCgpCnsKZnB1dHMoYnVmZmVyLHN0ZG91dCk7CmluZCA9IDA7Cn0KIApzdGF0aWMgY2hhciBzYnVmWzEyXSA9IHswLDAsMCwwLDAsMCwwLDAsMCwwLCdcbicsMH07CmlubGluZSBjaGFyICogaXRvYSh1bnNpZ25lZCBpbnQgX2EsIHVuc2lnbmVkIGludCAmIF9sZW4pCnsKY2hhciAqcG9zID0gc2J1ZiArIDEwOwpkbwp7CiotLXBvcyA9ICcwJyArIChfYSUxMCk7Cl9hLz0xMDsKfSB3aGlsZShfYSk7Cl9sZW4gPSBzYnVmKzExLXBvczsKcmV0dXJuIHBvczsKfQogCmlubGluZSB2b2lkIGJ1ZndyaXRlKHVuc2lnbmVkIGludCBfYSkKewpjaGFyICpzID0gMDsKdW5zaWduZWQgaW50IGxlbjsKIApzID0gaXRvYShfYSwgbGVuKTsKc3RyY3B5KGJ1ZmZlcitpbmQsIHMpOwppbmQrPWxlbjsKIAppZihpbmQ+ODAwMCkKZmx1c2goKTsKfQogCmlubGluZSBib29sIHByaW50X2Zyb21fYXJyYXkodW5zaWduZWQgaW50IF9tLCB1bnNpZ25lZCBpbnQgX24pCnsKaWYoX20gPiAzMTYwNykgcmV0dXJuIHRydWU7CmlmKF9uIDwgMikgcmV0dXJuIGZhbHNlOwppZihfbSA8PSAyKSB7YnVmd3JpdGUoMik7IF9tPTI7fQppZihfbiA+IDIpCnsKdW5zaWduZWQgaW50IGkgPSAwOwpmb3IoaSA9IDA7IGkgPCAzNDAwOyBpKyspCnsKaWYoKFBbaV0gPj0gX20pICYmIChQW2ldIDw9IF9uKSkKYnVmd3JpdGUoUFtpXSk7CmVsc2UgaWYoUFtpXSA+PSBfbikgcmV0dXJuIGZhbHNlOwp9Cn0KZWxzZQpyZXR1cm4gZmFsc2U7CnJldHVybiB0cnVlOwp9CiAKdm9pZCBwcmVjYWxjKCkKewp1bnNpZ25lZCBpbnQgcHAgPSAzLCBpID0gMCwgajsKZm9yKDsgcHAgPD0gMTc4OyBwcCs9MiwgaSsrKQppZighQVtpXSkKZm9yKGogPSBpK3BwOyBqIDw9IDE1ODAyOyBqKz1wcCkKQVtqXSA9IHRydWU7IC8vIG5vdCBhIHByaW1lCiAKZm9yKGkgPSAwLCBqID0gMDsgaSA8PSAxNTgwMjsgaSsrKQppZighQVtpXSkgUFtqKytdID0gKGk8PDEpICsgMzsKUFszNDAwXSA9IDEwMDAwMDsKQS5yZXNldCgpOwp9CiAKdm9pZCBwcmludF9wcmltZXModW5zaWduZWQgaW50IF9tLCB1bnNpZ25lZCBpbnQgX24pCnsKaWYoIXByaW50X2Zyb21fYXJyYXkoX20sIF9uKSkge2ZsdXNoKCk7cmV0dXJuO30KIAppZihfbTw9MzE2MDcpIF9tID0gMzE2Mjc7CnVuc2lnbmVkIGludCBtYXggPSAodW5zaWduZWQgaW50KSBzcXJ0KChkb3VibGUpX24pICsxLCBjLCBwPTMsIGk9MCwgaiwgazsKZm9yKDsgbWF4ID49IFBbaV07IHAgPSBQWysraV0pCnsKYyA9ICh1bnNpZ25lZCBpbnQpIGNlaWwoKGRvdWJsZSlfbS9wKSpwOwppZighKGMmMSkpIGMrPXA7CmZvcihqID0gYywgayA9IChjLV9tKS8yOyBqIDw9IF9uOyBqICs9IDIqcCwgayArPSBwKQpBW2tdID0gdHJ1ZTsKfQogCnAgPSBfbSYxID8gX20gOiBfbSsxOwpmb3IoaSA9IDA7IHAgPD0gX247IHArPTIsIGkrKykKaWYoIUFbaV0pIGJ1ZndyaXRlKHApOwpmbHVzaCgpOwogCkEucmVzZXQoKTsKfQogCmludCBtYWluKCkKewp1bnNpZ25lZCBpbnQgdD0wLCBtPTAsIG49MDsKc2NhbmYoIiV1IiwgJnQpOwogCnByZWNhbGMoKTsKd2hpbGUodC0tKQp7CnNjYW5mKCIldSAldSIsICZtLCAmbik7CnByaW50X3ByaW1lcyhtLCBuKTsKcHV0cygiIik7Cn0KIApyZXR1cm4gMDsKfQ==