//-------------------------------------------------------------------------------------------
//
// Sobol.cpp
//
// Author: Struan Robertson
// Date: 10/Aug/2013
//
// This file contains the implementation of the Sobol class.
//
//-------------------------------------------------------------------------------------------
#include "Sobol.h"
#include <algorithm>
using namespace std;
static const int V1 [] = {
0, 0, 1, 3, 1, 3, 1, 3, 3, 1,
3, 1, 3, 1, 3, 1, 1, 3, 1, 3,
1, 3, 1, 3, 3, 1, 1, 1, 3, 1,
3, 1, 3, 3, 1, 3, 1, 1, 1, 3,
1, 3, 1, 1, 1, 3, 3, 1, 3, 3,
1, 1, 3, 3, 1, 3, 3, 3, 1, 3,
1, 3, 1, 1, 3, 3, 1, 1, 1, 1,
3, 1, 1, 3, 1, 1, 1, 3, 3, 1,
3, 3, 1, 3, 3, 3, 1, 3, 3, 3,
1, 3, 3, 1, 3, 3, 3, 1, 3, 1,
3, 1, 1, 3, 3, 1, 3, 3, 1, 1,
1, 3, 3, 1, 3, 3, 1, 3, 1, 1,
3, 3, 3, 1, 1, 1, 3, 1, 1, 3,
1, 1, 3, 3, 1, 3, 1, 3, 3, 3,
3, 1, 1, 1, 3, 3, 1, 1, 3, 1,
1, 1, 1, 1, 1, 3, 1, 3, 1, 1,
1, 3, 1, 3, 1, 3, 3, 3, 1, 1,
3, 3, 1, 3, 1, 3, 1, 1, 3, 1,
3, 1, 3, 1, 3, 1, 1, 1, 3, 3,
1, 3, 3, 1, 3, 1, 1, 1, 3, 1,
3, 1, 1, 3, 1, 1, 3, 3, 1, 1,
3, 3, 3, 1, 3, 3, 3, 1, 3, 1,
3, 1, 1, 1, 3, 1, 1, 1, 3, 1,
1, 1, 1, 1, 3, 3, 3, 1, 1, 1,
1, 3, 3, 3, 1, 3, 3, 1, 1, 1,
1, 3, 1, 1, 3, 1, 3, 3, 1, 1,
3, 3, 1, 1, 1, 1, 3, 1, 3, 3,
1, 3, 3, 1, 1, 1, 3, 3, 3, 1,
3, 3, 1, 3, 3, 1, 3, 1, 3, 3,
3, 1, 3, 1, 1, 3, 1, 3, 1, 1,
1, 3, 3, 3, 1, 1, 3, 1, 3, 1,
1, 1, 1, 1, 1, 3, 1, 1, 3, 1,
3, 3, 1, 1, 1, 1, 3, 1, 3, 1,
3, 1, 1, 1, 1, 3, 3, 1, 1, 1,
1, 1, 3, 3, 3, 1, 1, 3, 3, 3,
3, 3, 1, 3, 3, 1, 3, 3, 3, 3,
1, 1, 1, 1, 1, 1, 3, 1, 1, 3,
1, 1, 1, 3, 1, 1, 1, 3, 3, 3,
1, 3, 1, 1, 3, 3, 3, 1, 3, 3,
1, 3, 1, 3, 3, 1, 3, 3, 3, 1,
1, 3, 3, 1, 3, 1, 3, 1, 1, 1,
3, 3, 3, 3, 1, 3, 1, 1, 3, 1,
3, 1, 1, 1, 3, 1, 3, 1, 3, 1,
3, 3, 3, 3, 3, 3, 3, 3, 1, 3,
3, 3, 3, 3, 1, 3, 1, 3, 3, 3,
1, 3, 1, 3, 1, 3, 3, 1, 3, 3,
3, 3, 3, 3, 3, 3, 3, 1, 1, 1,
1, 1, 1, 3, 3, 1, 1, 3, 3, 1,
1, 1, 3, 3, 1, 1, 3, 3, 3, 3,
1, 1, 3, 1, 3, 3, 1, 3, 3, 1,
1, 1, 3, 3, 3, 1, 1, 3, 3, 3,
3, 3, 1, 1, 1, 3, 1, 3, 3, 1,
3, 3, 3, 3, 1, 1, 3, 1, 1, 3,
1, 3, 1, 3, 1, 3, 3, 1, 1, 3,
3, 1, 3, 3, 1, 3, 3, 1, 1, 3,
1, 3, 3, 1, 1, 3, 1, 3, 1, 3,
1, 1, 3, 3, 1, 1, 1, 3, 3, 1,
3, 1, 1, 3, 3, 1, 1, 3, 1, 3,
1, 1, 1, 1, 1, 3, 1, 1, 1, 1,
3, 1, 3, 1, 1, 3, 3, 1, 1, 3,
1, 3, 1, 3, 3, 3, 1, 3, 3, 3,
1, 1, 3, 3, 3, 1, 1, 1, 1, 3,
1, 3, 1, 3, 1, 1, 3, 3, 1, 1,
1, 3, 3, 1, 3, 1, 3, 1, 1, 1,
1, 1, 1, 3, 1, 3, 3, 1, 3, 3,
3, 1, 3, 1, 1, 3, 3, 1, 1, 3,
3, 1, 1, 1, 3, 1, 3, 3, 1, 1,
3, 1, 1, 3, 1, 3, 1, 1, 1, 3,
3, 3, 3, 1, 1, 3, 3, 1, 1, 1,
1, 3, 1, 1, 3, 3, 3, 1, 1, 3,
3, 1, 3, 3, 1, 1, 3, 3, 3, 3,
3, 3, 3, 1, 3, 3, 1, 3, 1, 3,
1, 1, 3, 3, 1, 1, 1, 3, 1, 3,
3, 1, 3, 3, 1, 3, 1, 1, 3, 3,
3, 1, 1, 1, 3, 1, 1, 1, 3, 3,
3, 1, 3, 3, 1, 3, 1, 1, 3, 3,
3, 1, 3, 3, 1, 1, 1, 3, 1, 3,
3, 3, 3, 3, 3, 3, 3, 1, 3, 3,
1, 3, 1, 1, 3, 3, 3, 1, 3, 3,
3, 3, 3, 1, 3, 3, 3, 1, 1, 1,
3, 3, 1, 3, 3, 1, 3, 1, 3, 1,
3, 1, 3, 3, 3, 3, 3, 3, 1, 1,
3, 1, 3, 1, 1, 1, 1, 1, 3, 1,
1, 1, 3, 1, 3, 1, 1, 3, 3, 3,
1, 3, 1, 3, 1, 1, 3, 1, 3, 3,
1, 3, 1, 3, 3, 1, 3, 3, 1, 3,
3, 3, 3, 3, 3, 1, 3, 1, 1, 3,
3, 3, 1, 1, 3, 3, 3, 3, 3, 3,
3, 1, 3, 3, 3, 3, 1, 3, 1, 3,
3, 3, 1, 3, 1, 3, 1, 1, 1, 3,
3, 1, 3, 1, 1, 3, 3, 1, 3, 1,
1, 1, 1, 3, 1, 3, 1, 1, 3, 1,
3, 1, 3, 3, 3, 3, 3, 3, 1, 3,
3, 3, 3, 1, 3, 3, 1, 3, 3, 3,
3, 3, 1, 1, 1, 1, 3, 3, 3, 1,
3, 3, 1, 1, 3, 3, 1, 1, 3, 3,
1, 3, 1, 1, 3, 1, 3, 3, 3, 3,
3, 1, 3, 1, 1, 3, 3, 3, 3, 1,
3, 1, 1, 3, 3, 3, 3, 3, 3, 1,
1, 3, 1, 3, 1, 1, 3, 1, 1, 1,
1, 3, 3, 1, 1, 3, 1, 1, 1, 3,
1, 3, 1, 1, 3, 3, 1, 3, 1, 1,
3, 3, 3, 3, 3, 1, 3, 1, 1, 1,
3, 1, 1, 1, 3, 1, 1, 3, 1, 3,
3, 3, 3, 3, 1, 1, 1, 3, 3, 3,
3, 1, 3, 3, 3, 3, 1, 1, 3, 3,
3, 1, 3, 1, 1, 3, 3, 1, 3, 3,
1, 1, 1, 1, 1, 3, 1, 1, 3, 3,
1, 1, 1, 3, 1, 1, 3, 3, 1, 3,
3, 3, 3, 3, 3, 3, 3, 1, 1, 3,
3, 1, 1, 3, 1, 3, 3, 3, 3, 3,
1 } ;
static const int V2 [] = {
0, 0, 0, 7, 5, 1, 3, 3, 7, 5,
5, 7, 7, 1, 3, 3, 7, 5, 1, 1,
5, 3, 7, 1, 7, 5, 1, 3, 7, 7,
1, 1, 1, 5, 7, 7, 5, 1, 3, 3,
7, 5, 5, 5, 3, 3, 3, 1, 1, 5,
1, 1, 5, 3, 3, 3, 3, 1, 3, 7,
5, 7, 3, 7, 1, 3, 3, 5, 1, 3,
5, 5, 7, 7, 7, 1, 1, 3, 3, 1,
1, 5, 1, 5, 7, 5, 1, 7, 5, 3,
3, 1, 5, 7, 1, 7, 5, 1, 7, 3,
1, 7, 1, 7, 3, 3, 5, 7, 3, 3,
5, 1, 3, 3, 1, 3, 5, 1, 3, 3,
3, 7, 1, 1, 7, 3, 1, 3, 7, 5,
5, 7, 5, 5, 3, 1, 3, 3, 3, 1,
3, 3, 7, 3, 3, 1, 7, 5, 1, 7,
7, 5, 7, 5, 1, 3, 1, 7, 3, 7,
3, 5, 7, 3, 1, 3, 3, 3, 1, 5,
7, 3, 3, 7, 7, 7, 5, 3, 1, 7,
1, 3, 7, 5, 3, 3, 3, 7, 1, 1,
3, 1, 5, 7, 1, 3, 5, 3, 5, 3,
3, 7, 5, 5, 3, 3, 1, 3, 7, 7,
7, 1, 5, 7, 1, 3, 1, 1, 7, 1,
3, 1, 7, 1, 5, 3, 5, 3, 1, 1,
5, 5, 3, 3, 5, 7, 1, 5, 3, 7,
7, 3, 5, 3, 3, 1, 7, 3, 1, 3,
5, 7, 1, 3, 7, 1, 5, 1, 3, 1,
5, 3, 1, 7, 1, 5, 5, 5, 3, 7,
1, 1, 7, 3, 1, 1, 7, 5, 7, 5,
7, 7, 3, 7, 1, 3, 7, 7, 3, 5,
1, 1, 7, 1, 5, 5, 5, 1, 5, 1,
7, 5, 5, 7, 1, 1, 7, 1, 7, 7,
1, 1, 3, 3, 3, 7, 7, 5, 3, 7,
3, 1, 3, 7, 5, 3, 3, 5, 7, 1,
1, 5, 5, 7, 7, 1, 1, 1, 1, 5,
5, 5, 7, 5, 7, 1, 1, 3, 5, 1,
3, 3, 7, 3, 7, 5, 3, 5, 3, 1,
7, 1, 7, 7, 1, 1, 7, 7, 7, 5,
5, 1, 1, 7, 5, 5, 7, 5, 1, 1,
5, 5, 5, 5, 5, 5, 1, 3, 1, 5,
7, 3, 3, 5, 7, 3, 7, 1, 7, 7,
1, 3, 5, 1, 5, 5, 3, 7, 3, 7,
7, 5, 7, 5, 7, 1, 1, 5, 3, 5,
1, 5, 3, 7, 1, 5, 7, 7, 3, 5,
1, 3, 5, 1, 5, 3, 3, 3, 7, 3,
5, 1, 3, 7, 7, 3, 7, 5, 3, 3,
1, 7, 5, 1, 1, 3, 7, 1, 7, 1,
7, 3, 7, 3, 5, 7, 3, 5, 3, 1,
1, 1, 5, 7, 7, 3, 3, 1, 1, 1,
5, 5, 7, 3, 1, 1, 3, 3, 7, 3,
3, 5, 1, 3, 7, 3, 3, 7, 3, 5,
7, 5, 7, 7, 3, 3, 5, 1, 3, 5,
3, 1, 3, 5, 1, 1, 3, 7, 7, 1,
5, 1, 3, 7, 3, 7, 3, 5, 1, 7,
1, 1, 3, 5, 3, 7, 1, 5, 5, 1,
1, 3, 1, 3, 3, 7, 1, 7, 3, 1,
7, 3, 1, 7, 3, 5, 3, 5, 7, 3,
3, 3, 5, 1, 7, 7, 1, 3, 1, 3,
7, 7, 1, 3, 7, 3, 1, 5, 3, 1,
1, 1, 5, 3, 3, 7, 1, 5, 3, 5,
1, 3, 1, 3, 1, 5, 7, 7, 1, 1,
5, 3, 1, 5, 1, 1, 7, 7, 3, 5,
5, 1, 7, 1, 5, 1, 1, 3, 1, 5,
7, 5, 7, 7, 1, 5, 1, 1, 3, 5,
1, 5, 5, 3, 1, 3, 1, 5, 5, 3,
3, 3, 3, 1, 1, 3, 1, 3, 5, 5,
7, 5, 5, 7, 5, 7, 1, 3, 7, 7,
3, 5, 5, 7, 5, 5, 3, 3, 3, 1,
7, 1, 5, 5, 5, 3, 3, 5, 1, 3,
1, 3, 3, 3, 7, 1, 7, 7, 3, 7,
1, 1, 5, 7, 1, 7, 1, 7, 7, 1,
3, 7, 5, 1, 3, 5, 5, 5, 1, 1,
7, 1, 7, 1, 7, 7, 3, 1, 1, 5,
1, 5, 1, 5, 3, 5, 5, 5, 5, 5,
3, 3, 7, 3, 3, 5, 5, 3, 7, 1,
5, 7, 5, 1, 5, 5, 3, 5, 5, 7,
5, 3, 5, 5, 5, 1, 5, 5, 5, 5,
1, 3, 5, 3, 1, 7, 5, 5, 7, 1,
5, 3, 3, 1, 5, 3, 7, 1, 7, 5,
1, 1, 3, 1, 1, 7, 1, 5, 5, 3,
7, 3, 7, 5, 3, 1, 1, 3, 1, 3,
5, 5, 7, 5, 3, 7, 7, 7, 3, 7,
3, 7, 1, 3, 1, 7, 7, 1, 7, 3,
7, 3, 7, 3, 7, 3, 5, 1, 1, 7,
3, 1, 5, 5, 7, 1, 5, 5, 5, 7,
1, 5, 5, 1, 5, 5, 3, 1, 3, 1,
7, 3, 1, 3, 5, 7, 7, 7, 1, 1,
7, 3, 1, 5, 5, 5, 1, 1, 1, 1,
1, 5, 3, 5, 1, 3, 5, 3, 1, 1,
1, 1, 3, 7, 3, 7, 5, 7, 1, 5,
5, 7, 5, 3, 3, 7, 5, 3, 1, 1,
3, 1, 3, 1, 1, 3, 7, 1, 7, 1,
1, 5, 1, 7, 5, 3, 7, 3, 5, 3,
1, 1, 5, 5, 1, 7, 7, 3, 7, 3,
7, 1, 5, 1, 5, 3, 7, 3, 5, 7,
7, 7, 3, 3, 1, 1, 5, 5, 3, 7,
1, 1, 1, 3, 5, 3, 1, 1, 3, 3,
7, 5, 1, 1, 3, 7, 1, 5, 7, 3,
7, 5, 5, 7, 3, 5, 3, 1, 5, 3,
1, 1, 7, 5, 1, 7, 3, 7, 5, 1,
7, 1, 7, 7, 1, 1, 7, 1, 5, 5,
1, 1, 7, 5, 7, 1, 5, 3, 5, 3,
3, 7, 1, 5, 1, 1, 5, 5, 3, 3,
7, 5, 5, 1, 1, 1, 3, 1, 5, 7,
7, 1, 7, 5, 7, 3, 7, 3, 1, 3,
7, 3, 1, 5, 5, 3, 5, 1, 3, 5,
5, 5, 1, 1, 7, 7, 1, 5, 5, 1,
3, 5, 1, 5, 3, 5, 3, 3, 7, 5,
7, 3, 7, 3, 1, 3, 7, 7, 3, 3,
1, 1, 3, 3, 3, 3, 3, 5, 5, 3,
3, 3, 1, 3, 5, 7, 7, 1, 5, 7,
3, 7, 1, 1, 3, 5, 7, 5, 3, 3,
3 } ;
static const int V3 [] = {
0, 0, 0, 0, 0, 1, 7, 9, 13, 11,
1, 3, 7, 9, 5, 13, 13, 11, 3, 15,
5, 3, 15, 7, 9, 13, 9, 1, 11, 7,
5, 15, 1, 15, 11, 5, 11, 1, 7, 9,
7, 7, 1, 15, 15, 15, 13, 3, 3, 15,
5, 9, 7, 13, 3, 7, 5, 11, 9, 1,
9, 1, 5, 7, 13, 9, 9, 1, 7, 3,
5, 1, 11, 11, 13, 7, 7, 9, 9, 1,
1, 3, 9, 15, 1, 5, 13, 1, 9, 9,
9, 9, 9, 13, 11, 3, 5, 11, 11, 13,
5, 3, 15, 1, 11, 11, 7, 13, 15, 11,
13, 9, 11, 15, 15, 13, 3, 15, 7, 9,
11, 13, 11, 9, 9, 5, 13, 9, 1, 13,
7, 7, 7, 7, 7, 5, 9, 7, 13, 11,
9, 11, 15, 3, 13, 11, 1, 11, 3, 3,
9, 11, 1, 7, 1, 15, 15, 3, 1, 9,
1, 7, 13, 11, 3, 13, 11, 7, 3, 3,
5, 13, 11, 5, 11, 1, 3, 9, 7, 15,
7, 5, 13, 7, 9, 13, 15, 13, 9, 7,
15, 7, 9, 5, 11, 11, 13, 13, 9, 3,
5, 13, 9, 11, 15, 11, 7, 1, 7, 13,
3, 13, 3, 13, 9, 15, 7, 13, 13, 3,
13, 15, 15, 11, 9, 13, 9, 15, 1, 1,
15, 11, 11, 7, 1, 11, 13, 9, 13, 3,
5, 11, 13, 9, 9, 13, 1, 11, 15, 13,
3, 13, 7, 15, 1, 15, 3, 3, 11, 7,
13, 7, 7, 9, 7, 5, 15, 9, 5, 5,
7, 15, 13, 15, 5, 15, 5, 3, 1, 11,
7, 1, 5, 7, 9, 3, 11, 1, 15, 1,
3, 15, 11, 13, 5, 13, 1, 7, 1, 15,
7, 5, 1, 1, 15, 13, 11, 11, 13, 5,
11, 7, 9, 7, 1, 5, 3, 9, 5, 5,
11, 5, 1, 7, 1, 11, 7, 9, 13, 15,
13, 3, 1, 11, 13, 15, 1, 1, 11, 9,
13, 3, 13, 11, 15, 13, 9, 9, 9, 5,
5, 5, 5, 1, 15, 5, 9, 11, 7, 15,
5, 3, 13, 5, 3, 11, 5, 1, 11, 13,
9, 11, 3, 7, 13, 15, 1, 7, 11, 1,
13, 1, 15, 1, 9, 7, 3, 9, 11, 1,
9, 13, 13, 3, 11, 7, 9, 1, 7, 15,
9, 1, 5, 13, 5, 11, 3, 9, 15, 11,
13, 5, 1, 7, 7, 5, 13, 7, 7, 9,
5, 11, 11, 1, 1, 15, 3, 13, 9, 13,
9, 9, 11, 5, 5, 13, 15, 3, 9, 15,
3, 11, 11, 15, 15, 3, 11, 15, 15, 3,
1, 3, 1, 3, 3, 1, 3, 13, 1, 11,
5, 15, 7, 15, 9, 1, 7, 1, 9, 11,
15, 1, 13, 9, 13, 11, 7, 3, 7, 3,
13, 7, 9, 7, 7, 3, 3, 9, 9, 7,
5, 11, 13, 13, 7, 7, 15, 9, 5, 5,
3, 3, 13, 3, 9, 3, 1, 11, 1, 3,
11, 15, 11, 11, 11, 9, 13, 7, 9, 15,
9, 11, 1, 3, 3, 9, 7, 15, 13, 13,
7, 15, 9, 13, 9, 15, 13, 15, 9, 13,
1, 11, 7, 11, 3, 13, 5, 1, 7, 15,
3, 13, 7, 13, 13, 11, 3, 5, 3, 13,
11, 9, 9, 3, 11, 11, 7, 9, 13, 11,
7, 15, 13, 7, 5, 3, 1, 5, 15, 15,
3, 11, 1, 7, 3, 15, 11, 5, 5, 3,
5, 5, 1, 15, 5, 1, 5, 3, 7, 5,
11, 3, 13, 9, 13, 15, 5, 3, 5, 9,
5, 3, 11, 1, 13, 9, 15, 3, 5, 11,
9, 1, 3, 15, 9, 9, 9, 11, 7, 5,
13, 1, 15, 3, 13, 9, 13, 5, 1, 5,
1, 13, 13, 7, 7, 1, 9, 5, 11, 9,
11, 13, 3, 15, 15, 13, 15, 7, 5, 7,
9, 7, 9, 9, 9, 11, 9, 3, 11, 15,
13, 13, 5, 9, 15, 1, 1, 9, 5, 13,
3, 13, 15, 3, 1, 3, 11, 13, 1, 15,
9, 9, 3, 1, 9, 1, 9, 1, 13, 11,
15, 7, 11, 15, 13, 15, 1, 9, 9, 7,
3, 5, 11, 7, 3, 9, 5, 15, 7, 5,
3, 13, 7, 1, 1, 9, 15, 15, 15, 11,
3, 5, 15, 13, 7, 15, 15, 11, 11, 9,
5, 15, 9, 7, 3, 13, 1, 1, 5, 1,
3, 1, 7, 1, 1, 5, 1, 11, 11, 9,
9, 5, 13, 7, 7, 7, 1, 1, 9, 9,
11, 11, 15, 7, 5, 5, 3, 11, 1, 3,
7, 13, 7, 7, 7, 3, 15, 15, 11, 9,
3, 9, 3, 15, 13, 5, 3, 3, 3, 5,
9, 15, 9, 9, 1, 5, 9, 9, 15, 5,
15, 7, 9, 1, 9, 9, 5, 11, 5, 15,
15, 11, 7, 7, 7, 1, 1, 11, 11, 13,
15, 3, 13, 5, 1, 7, 1, 11, 3, 13,
15, 3, 5, 3, 5, 7, 3, 9, 9, 5,
1, 7, 11, 9, 3, 5, 11, 13, 13, 13,
9, 15, 5, 7, 1, 15, 11, 9, 15, 15,
13, 13, 13, 1, 11, 9, 15, 9, 5, 15,
5, 7, 3, 11, 3, 15, 7, 13, 11, 7,
3, 7, 13, 5, 13, 15, 5, 13, 9, 1,
15, 11, 5, 5, 1, 11, 3, 3, 7, 1,
9, 7, 15, 9, 9, 3, 11, 15, 7, 1,
3, 1, 1, 1, 9, 1, 5, 15, 15, 7,
5, 5, 7, 9, 7, 15, 13, 13, 11, 1,
9, 11, 1, 13, 1, 7, 15, 15, 5, 5,
1, 11, 3, 9, 11, 9, 9, 9, 1, 9,
3, 5, 15, 1, 1, 9, 7, 3, 3, 1,
9, 9, 11, 9, 9, 13, 13, 3, 13, 11,
13, 5, 1, 5, 5, 9, 9, 3, 13, 13,
9, 15, 9, 11, 7, 11, 9, 13, 9, 1,
15, 9, 7, 7, 1, 7, 9, 9, 15, 1,
11, 1, 13, 13, 15, 9, 13, 7, 15, 3,
9, 3, 1, 13, 7, 5, 9, 3, 1, 7,
1, 1, 13, 3, 3, 11, 1, 7, 13, 15,
15, 5, 7, 13, 13, 15, 11, 13, 1, 13,
13, 3, 9, 15, 15, 11, 15, 9, 15, 1,
13, 15, 1, 1, 5, 11, 5, 1, 11, 11,
5, 3, 9, 1, 3, 5, 13, 9, 7, 7,
1, 9, 9, 15, 7, 5, 5, 15, 13, 9,
7, 13, 3, 13, 11, 13, 7, 9, 13, 13,
13, 15, 9, 5, 5, 3, 3, 3, 1, 3,
15 } ;
static const int V4 [] = {
0, 0, 0, 0, 0, 0, 0, 9, 3, 27,
15, 29, 21, 23, 19, 11, 25, 7, 13, 17,
1, 25, 29, 3, 31, 11, 5, 23, 27, 19,
21, 5, 1, 17, 13, 7, 15, 9, 31, 25,
3, 5, 23, 7, 3, 17, 23, 3, 3, 21,
25, 25, 23, 11, 19, 3, 11, 31, 7, 9,
5, 17, 23, 17, 17, 25, 13, 11, 31, 27,
19, 17, 23, 7, 5, 11, 19, 19, 7, 13,
21, 21, 7, 9, 11, 1, 5, 21, 11, 13,
25, 9, 7, 7, 27, 15, 25, 15, 21, 17,
19, 19, 21, 5, 11, 3, 5, 29, 31, 29,
5, 5, 1, 31, 27, 11, 13, 1, 3, 7,
11, 7, 3, 23, 13, 31, 17, 1, 27, 11,
25, 1, 23, 29, 17, 25, 7, 25, 27, 17,
13, 17, 23, 5, 17, 5, 13, 11, 21, 5,
11, 5, 9, 31, 19, 17, 9, 9, 27, 21,
15, 15, 1, 1, 29, 5, 31, 11, 17, 23,
19, 21, 25, 15, 11, 5, 5, 1, 19, 19,
19, 7, 13, 21, 17, 17, 25, 23, 19, 23,
15, 13, 5, 19, 25, 9, 7, 3, 21, 17,
25, 1, 27, 25, 27, 25, 9, 13, 3, 17,
25, 23, 9, 25, 9, 13, 17, 17, 3, 15,
7, 7, 29, 3, 19, 29, 29, 19, 29, 13,
15, 25, 27, 1, 3, 9, 9, 13, 31, 29,
31, 5, 15, 29, 1, 19, 5, 9, 19, 5,
15, 3, 5, 7, 15, 17, 17, 23, 11, 9,
23, 19, 3, 17, 1, 27, 9, 9, 17, 13,
25, 29, 23, 29, 11, 31, 25, 21, 29, 19,
27, 31, 3, 5, 3, 3, 13, 21, 9, 29,
3, 17, 11, 11, 9, 21, 19, 7, 17, 31,
25, 1, 27, 5, 15, 27, 29, 29, 29, 25,
27, 25, 3, 21, 17, 25, 13, 15, 17, 13,
23, 9, 3, 11, 7, 9, 9, 7, 17, 7,
1, 27, 1, 9, 5, 31, 21, 25, 25, 21,
11, 1, 23, 19, 27, 15, 3, 5, 23, 9,
25, 7, 29, 11, 9, 13, 5, 11, 1, 3,
31, 27, 3, 17, 27, 11, 13, 15, 29, 15,
1, 15, 23, 25, 13, 21, 15, 3, 29, 29,
5, 25, 17, 11, 7, 15, 5, 21, 7, 31,
13, 11, 23, 5, 7, 23, 27, 21, 29, 15,
7, 27, 27, 19, 7, 15, 27, 27, 19, 19,
9, 15, 1, 3, 29, 29, 5, 27, 31, 9,
1, 7, 3, 19, 19, 29, 9, 3, 21, 31,
29, 25, 1, 3, 9, 27, 5, 27, 25, 21,
11, 29, 31, 27, 21, 29, 17, 9, 17, 13,
11, 25, 15, 21, 11, 19, 31, 3, 19, 5,
3, 3, 9, 13, 13, 3, 29, 7, 5, 9,
23, 13, 21, 23, 21, 31, 11, 7, 7, 3,
23, 1, 23, 5, 9, 17, 21, 1, 17, 29,
7, 5, 17, 13, 25, 17, 9, 19, 9, 5,
7, 21, 19, 13, 9, 7, 3, 9, 3, 15,
31, 29, 29, 25, 13, 9, 21, 9, 31, 7,
15, 5, 31, 7, 15, 27, 25, 19, 9, 9,
25, 25, 23, 1, 9, 7, 11, 15, 19, 15,
27, 17, 11, 11, 31, 13, 25, 25, 9, 7,
13, 29, 19, 5, 19, 31, 25, 13, 25, 15,
5, 9, 29, 31, 9, 29, 27, 25, 27, 11,
17, 5, 17, 3, 23, 15, 9, 9, 17, 17,
31, 11, 19, 25, 13, 23, 15, 25, 21, 31,
19, 3, 11, 25, 7, 15, 19, 7, 5, 3,
13, 13, 1, 23, 5, 25, 11, 25, 15, 13,
21, 11, 23, 29, 5, 17, 27, 9, 19, 15,
5, 29, 23, 19, 1, 27, 3, 23, 21, 19,
27, 11, 17, 13, 27, 11, 31, 23, 5, 9,
21, 31, 29, 11, 21, 17, 15, 7, 15, 7,
9, 21, 27, 25, 29, 11, 3, 21, 13, 23,
19, 27, 17, 29, 25, 17, 9, 1, 19, 23,
5, 23, 1, 17, 17, 13, 27, 23, 7, 7,
11, 13, 17, 13, 11, 21, 13, 23, 1, 27,
13, 9, 7, 1, 27, 29, 5, 13, 25, 21,
3, 31, 15, 13, 3, 19, 13, 1, 27, 15,
17, 1, 3, 13, 13, 13, 31, 29, 27, 7,
7, 21, 29, 15, 17, 17, 21, 19, 17, 3,
15, 5, 27, 27, 3, 31, 31, 7, 21, 3,
13, 11, 17, 27, 25, 1, 9, 7, 29, 27,
21, 23, 13, 25, 29, 15, 17, 29, 9, 15,
3, 21, 15, 17, 17, 31, 9, 9, 23, 19,
25, 3, 1, 11, 27, 29, 1, 31, 29, 25,
29, 1, 23, 29, 25, 13, 3, 31, 25, 5,
5, 11, 3, 21, 9, 23, 7, 11, 23, 11,
1, 1, 3, 23, 25, 23, 1, 23, 3, 27,
9, 27, 3, 23, 25, 19, 29, 29, 13, 27,
5, 9, 29, 29, 13, 17, 3, 23, 19, 7,
13, 3, 19, 23, 5, 29, 29, 13, 13, 5,
19, 5, 17, 9, 11, 11, 29, 27, 23, 19,
17, 25, 13, 1, 13, 3, 11, 1, 17, 29,
1, 13, 17, 9, 17, 21, 1, 11, 1, 1,
25, 5, 7, 29, 29, 19, 19, 1, 29, 13,
3, 1, 31, 15, 13, 3, 1, 11, 19, 5,
29, 13, 29, 23, 3, 1, 31, 13, 19, 17,
5, 5, 1, 29, 23, 3, 19, 25, 19, 27,
9, 27, 13, 15, 29, 23, 13, 25, 25, 17,
19, 17, 15, 27, 3, 25, 17, 27, 3, 27,
31, 23, 13, 31, 11, 15, 7, 21, 19, 27,
19, 21, 29, 7, 31, 13, 9, 9, 7, 21,
13, 11, 9, 11, 29, 19, 11, 19, 21, 5,
29, 13, 7, 19, 19, 27, 23, 31, 1, 27,
21, 7, 3, 7, 11, 23, 13, 29, 11, 31,
19, 1, 5, 5, 11, 5, 3, 27, 5, 7,
11, 31, 1, 27, 31, 31, 23, 5, 21, 27,
9, 25, 3, 15, 19, 1, 19, 9, 5, 25,
21, 15, 25, 29, 15, 21, 11, 19, 15, 3,
7, 13, 11, 25, 17, 1, 5, 31, 13, 29,
23, 9, 5, 29, 7, 17, 27, 7, 17, 31,
9, 31, 9, 9, 7, 21, 3, 3, 3, 9,
11, 21, 11, 31, 9, 25, 5, 1, 31, 13,
29, 9, 29, 1, 11, 19, 7, 27, 13, 31,
7, 31, 7, 25, 23, 21, 29, 11, 11, 13,
11, 27, 1, 23, 31, 21, 23, 21, 19, 31,
5, 31, 25, 25, 19, 17, 11, 25, 7, 13,
1, 29, 17, 23, 15, 7, 29, 17, 13, 3,
17 } ;
static const int V5 [] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 37, 33, 7, 5, 11, 39, 63,
59, 17, 15, 23, 29, 3, 21, 13, 31, 25,
9, 49, 33, 19, 29, 11, 19, 27, 15, 25,
63, 55, 17, 63, 49, 19, 41, 59, 3, 57,
33, 49, 53, 57, 57, 39, 21, 7, 53, 9,
55, 15, 59, 19, 49, 31, 3, 39, 5, 5,
41, 9, 19, 9, 57, 25, 1, 15, 51, 11,
19, 61, 53, 29, 19, 11, 9, 21, 19, 43,
13, 13, 41, 25, 31, 9, 11, 19, 5, 53,
37, 7, 51, 45, 7, 7, 61, 23, 45, 7,
59, 41, 1, 29, 61, 37, 27, 47, 15, 31,
35, 31, 17, 51, 13, 25, 45, 5, 5, 33,
39, 5, 47, 29, 35, 47, 63, 45, 37, 47,
59, 21, 59, 33, 51, 9, 27, 13, 25, 43,
3, 17, 21, 59, 61, 27, 47, 57, 11, 17,
39, 1, 63, 21, 59, 17, 13, 31, 3, 31,
7, 9, 27, 37, 23, 31, 9, 45, 43, 31,
63, 21, 39, 51, 27, 7, 53, 11, 1, 59,
39, 23, 49, 23, 7, 55, 59, 3, 19, 35,
13, 9, 13, 15, 23, 9, 7, 43, 55, 3,
19, 9, 27, 33, 27, 49, 23, 47, 19, 7,
11, 55, 27, 35, 5, 5, 55, 35, 37, 9,
33, 29, 47, 25, 11, 47, 53, 61, 59, 3,
53, 47, 5, 19, 59, 5, 47, 23, 45, 53,
3, 49, 61, 47, 39, 29, 17, 57, 5, 17,
31, 23, 41, 39, 5, 27, 7, 29, 29, 33,
31, 41, 31, 29, 17, 29, 29, 9, 9, 31,
27, 53, 35, 5, 61, 1, 49, 13, 57, 29,
5, 21, 43, 25, 57, 49, 37, 27, 11, 61,
37, 49, 5, 63, 63, 3, 45, 37, 63, 21,
21, 19, 27, 59, 21, 45, 23, 13, 15, 3,
43, 63, 39, 19, 63, 31, 41, 41, 15, 43,
63, 53, 1, 63, 31, 7, 17, 11, 61, 31,
51, 37, 29, 59, 25, 63, 59, 47, 15, 27,
19, 29, 45, 35, 55, 39, 19, 43, 21, 19,
13, 17, 51, 37, 5, 33, 35, 49, 25, 45,
1, 63, 47, 9, 63, 15, 25, 25, 15, 41,
13, 3, 19, 51, 49, 37, 25, 49, 13, 53,
47, 23, 35, 29, 33, 21, 35, 23, 3, 43,
31, 63, 9, 1, 61, 43, 3, 11, 55, 11,
35, 1, 63, 35, 49, 19, 45, 9, 57, 51,
1, 47, 41, 9, 11, 37, 19, 55, 23, 55,
55, 13, 7, 47, 37, 11, 43, 17, 3, 25,
19, 55, 59, 37, 33, 43, 1, 5, 21, 5,
63, 49, 61, 21, 51, 15, 19, 43, 47, 17,
9, 53, 45, 11, 51, 25, 11, 25, 47, 47,
1, 43, 29, 17, 31, 15, 59, 27, 63, 11,
41, 51, 29, 7, 27, 63, 31, 43, 3, 29,
39, 3, 59, 59, 1, 53, 63, 23, 63, 47,
51, 23, 61, 39, 47, 21, 39, 15, 3, 9,
57, 61, 39, 37, 21, 51, 1, 23, 43, 27,
25, 11, 13, 21, 43, 7, 11, 33, 55, 1,
37, 35, 27, 61, 39, 5, 19, 61, 61, 57,
59, 21, 59, 61, 57, 25, 55, 27, 31, 41,
33, 63, 19, 57, 35, 13, 63, 35, 17, 11,
11, 49, 41, 55, 5, 45, 17, 35, 5, 31,
31, 37, 17, 45, 51, 1, 39, 49, 55, 19,
41, 13, 5, 51, 5, 49, 1, 21, 13, 17,
59, 51, 11, 3, 61, 1, 33, 37, 33, 61,
25, 27, 59, 7, 49, 13, 63, 3, 33, 3,
15, 9, 13, 35, 39, 11, 59, 59, 1, 57,
11, 5, 57, 13, 31, 13, 11, 55, 45, 9,
55, 55, 19, 25, 41, 23, 45, 29, 63, 59,
27, 39, 21, 37, 7, 61, 49, 35, 39, 9,
29, 7, 25, 23, 57, 5, 19, 15, 33, 49,
37, 25, 17, 45, 29, 15, 25, 3, 3, 49,
11, 39, 15, 19, 57, 39, 15, 11, 3, 57,
31, 55, 61, 19, 5, 41, 35, 59, 61, 39,
41, 53, 53, 63, 31, 9, 59, 13, 35, 55,
41, 49, 5, 41, 25, 27, 43, 5, 5, 43,
5, 5, 17, 5, 15, 27, 29, 17, 9, 3,
55, 31, 1, 45, 45, 13, 57, 17, 3, 61,
15, 49, 15, 47, 9, 37, 45, 9, 51, 61,
21, 33, 11, 21, 63, 63, 47, 57, 61, 49,
9, 59, 19, 29, 21, 23, 55, 23, 43, 41,
57, 9, 39, 27, 41, 35, 61, 29, 57, 63,
21, 31, 59, 35, 49, 3, 49, 47, 49, 33,
21, 19, 21, 35, 11, 17, 37, 23, 59, 13,
37, 35, 55, 57, 1, 29, 45, 11, 1, 15,
9, 33, 19, 53, 43, 39, 23, 7, 13, 13,
1, 19, 41, 55, 1, 13, 15, 59, 55, 15,
3, 57, 37, 31, 17, 1, 3, 21, 29, 25,
55, 9, 37, 33, 53, 41, 51, 19, 57, 13,
63, 43, 19, 7, 13, 37, 33, 19, 15, 63,
51, 11, 49, 23, 57, 47, 51, 15, 53, 41,
1, 15, 37, 61, 11, 35, 29, 33, 23, 55,
11, 59, 19, 61, 61, 45, 13, 49, 13, 63,
5, 61, 5, 31, 17, 61, 63, 13, 27, 57,
1, 21, 5, 11, 39, 57, 51, 53, 39, 25,
41, 39, 37, 23, 31, 25, 33, 17, 57, 29,
27, 23, 47, 41, 29, 19, 47, 41, 25, 5,
51, 43, 39, 29, 7, 31, 45, 51, 49, 55,
17, 43, 49, 45, 9, 29, 3, 5, 47, 9,
15, 19, 51, 45, 57, 63, 9, 21, 59, 3,
9, 13, 45, 23, 15, 31, 21, 15, 51, 35,
9, 11, 61, 23, 53, 29, 51, 45, 31, 29,
5, 35, 29, 53, 35, 17, 59, 55, 27, 51,
59, 27, 47, 15, 29, 37, 7, 49, 55, 5,
19, 45, 29, 19, 57, 33, 53, 45, 21, 9,
3, 35, 29, 43, 31, 39, 3, 45, 1, 41,
29, 5, 59, 41, 33, 35, 27, 19, 13, 25,
27, 43, 33, 35, 17, 17, 23, 7, 35, 15,
61, 61, 53, 5, 15, 23, 11, 13, 43, 55,
47, 25, 43, 15, 57, 45, 1, 49, 63, 57,
15, 31, 31, 7, 53, 27, 15, 47, 23, 7,
29, 53, 47, 9, 53, 3, 25, 55, 45, 63,
21, 17, 23, 31, 27, 27, 43, 63, 55, 63,
45, 51, 15, 27, 5, 37, 43, 11, 27, 5,
27, 59, 21, 7, 39, 27, 63, 35, 47, 55,
17, 17, 17, 3, 19, 21, 13, 49, 61, 39,
15 } ;
static const int V6 [] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 13,
33, 115, 41, 79, 17, 29, 119, 75, 73, 105,
7, 59, 65, 21, 3, 113, 61, 89, 45, 107,
21, 71, 79, 19, 71, 61, 41, 57, 121, 87,
119, 55, 85, 121, 119, 11, 23, 61, 11, 35,
33, 43, 107, 113, 101, 29, 87, 119, 97, 29,
17, 89, 5, 127, 89, 119, 117, 103, 105, 41,
83, 25, 41, 55, 69, 117, 49, 127, 29, 1,
99, 53, 83, 15, 31, 73, 115, 35, 21, 89,
5, 1, 91, 53, 35, 95, 83, 19, 85, 55,
51, 101, 33, 41, 55, 45, 95, 61, 27, 37,
89, 75, 57, 61, 15, 117, 15, 21, 27, 25,
27, 123, 39, 109, 93, 51, 21, 91, 109, 107,
45, 15, 93, 127, 3, 53, 81, 79, 107, 79,
87, 35, 109, 73, 35, 83, 107, 1, 51, 7,
59, 33, 115, 43, 111, 45, 121, 105, 125, 87,
101, 41, 95, 75, 1, 57, 117, 21, 27, 67,
29, 53, 117, 63, 1, 77, 89, 115, 49, 127,
15, 79, 81, 29, 65, 103, 33, 73, 79, 29,
21, 113, 31, 33, 107, 95, 111, 59, 99, 117,
63, 63, 99, 39, 9, 35, 63, 125, 99, 45,
93, 33, 93, 9, 105, 75, 51, 115, 11, 37,
17, 41, 21, 43, 73, 19, 93, 7, 95, 81,
93, 79, 81, 55, 9, 51, 63, 45, 89, 73,
19, 115, 39, 47, 81, 39, 5, 5, 45, 53,
65, 49, 17, 105, 13, 107, 5, 5, 19, 73,
59, 43, 83, 97, 115, 27, 1, 69, 103, 3,
99, 103, 63, 67, 25, 121, 97, 77, 13, 83,
103, 41, 11, 27, 81, 37, 33, 125, 71, 41,
41, 59, 41, 87, 123, 43, 101, 63, 45, 39,
21, 97, 15, 97, 111, 21, 49, 13, 17, 79,
91, 65, 105, 75, 1, 45, 67, 83, 107, 125,
87, 15, 81, 95, 105, 65, 45, 59, 103, 23,
103, 99, 67, 99, 47, 117, 71, 89, 35, 53,
73, 9, 115, 49, 37, 1, 35, 9, 45, 81,
19, 127, 17, 17, 105, 89, 49, 101, 7, 37,
33, 11, 95, 95, 17, 111, 105, 41, 115, 5,
69, 101, 27, 27, 101, 103, 53, 9, 21, 43,
79, 91, 65, 117, 87, 125, 55, 45, 63, 85,
83, 97, 45, 83, 87, 113, 93, 95, 5, 17,
77, 77, 127, 123, 45, 81, 85, 121, 119, 27,
85, 41, 49, 15, 107, 21, 51, 119, 11, 87,
101, 115, 63, 63, 37, 121, 109, 7, 43, 69,
19, 77, 49, 71, 59, 35, 7, 13, 55, 101,
127, 103, 85, 109, 29, 61, 67, 21, 111, 67,
23, 57, 75, 71, 101, 123, 41, 107, 101, 107,
125, 27, 47, 119, 41, 19, 127, 33, 31, 109,
7, 91, 91, 39, 125, 105, 47, 125, 123, 91,
9, 103, 45, 23, 117, 9, 125, 73, 11, 37,
61, 79, 21, 5, 47, 117, 67, 53, 85, 33,
81, 121, 47, 61, 51, 127, 29, 65, 45, 41,
95, 57, 73, 33, 117, 61, 111, 59, 123, 65,
47, 105, 23, 29, 107, 37, 81, 67, 29, 115,
119, 75, 73, 99, 103, 7, 57, 45, 61, 95,
49, 101, 101, 35, 47, 119, 39, 67, 31, 103,
7, 61, 127, 87, 3, 35, 29, 73, 95, 103,
71, 75, 51, 87, 57, 97, 11, 105, 87, 41,
73, 109, 69, 35, 121, 39, 111, 1, 77, 39,
47, 53, 91, 3, 17, 51, 83, 39, 125, 85,
111, 21, 69, 85, 29, 55, 11, 117, 1, 47,
17, 65, 63, 47, 117, 17, 115, 51, 25, 33,
123, 123, 83, 51, 113, 95, 121, 51, 91, 109,
43, 55, 35, 55, 87, 33, 37, 5, 3, 45,
21, 105, 127, 35, 17, 35, 37, 97, 97, 21,
77, 123, 17, 89, 53, 105, 75, 25, 125, 13,
47, 21, 125, 23, 55, 63, 61, 5, 17, 93,
57, 121, 69, 73, 93, 121, 105, 75, 91, 67,
95, 75, 9, 69, 97, 99, 93, 11, 53, 19,
73, 5, 33, 79, 107, 65, 69, 79, 125, 25,
93, 55, 61, 17, 117, 69, 97, 87, 111, 37,
93, 59, 79, 95, 53, 115, 53, 85, 85, 65,
59, 23, 75, 21, 67, 27, 99, 79, 27, 3,
95, 27, 69, 19, 75, 47, 59, 41, 85, 77,
99, 55, 49, 93, 93, 119, 51, 125, 63, 13,
15, 45, 61, 19, 105, 115, 17, 83, 7, 7,
11, 61, 37, 63, 89, 95, 119, 113, 67, 123,
91, 33, 37, 99, 43, 11, 33, 65, 81, 79,
81, 107, 63, 63, 55, 89, 91, 25, 93, 101,
27, 55, 75, 121, 79, 43, 125, 73, 27, 109,
35, 21, 71, 113, 89, 59, 95, 41, 45, 113,
119, 113, 39, 59, 73, 15, 13, 59, 67, 121,
27, 7, 105, 15, 59, 59, 35, 91, 89, 23,
125, 97, 53, 41, 91, 111, 29, 31, 3, 103,
61, 71, 35, 7, 119, 29, 45, 49, 111, 41,
109, 59, 125, 13, 27, 19, 79, 9, 75, 83,
81, 33, 91, 109, 33, 29, 107, 111, 101, 107,
109, 65, 59, 43, 37, 1, 9, 15, 109, 37,
111, 113, 119, 79, 73, 65, 71, 93, 17, 101,
87, 97, 43, 23, 75, 109, 41, 49, 53, 31,
97, 105, 109, 119, 51, 9, 53, 113, 97, 73,
89, 79, 49, 61, 105, 13, 99, 53, 71, 7,
87, 21, 101, 5, 71, 31, 123, 121, 121, 73,
79, 115, 13, 39, 101, 19, 37, 51, 83, 97,
55, 81, 91, 127, 105, 89, 63, 47, 49, 75,
37, 77, 15, 49, 107, 23, 23, 35, 19, 69,
17, 59, 63, 73, 29, 125, 61, 65, 95, 101,
81, 57, 69, 83, 37, 11, 37, 95, 1, 73,
27, 29, 57, 7, 65, 83, 99, 69, 19, 103,
43, 95, 25, 19, 103, 41, 125, 97, 71, 105,
83, 83, 61, 39, 9, 45, 117, 63, 31, 5,
117, 67, 125, 41, 117, 43, 77, 97, 15, 29,
5, 59, 25, 63, 87, 39, 39, 77, 85, 37,
81, 73, 89, 29, 125, 109, 21, 23, 119, 105,
43, 93, 97, 15, 125, 29, 51, 69, 37, 45,
31, 75, 109, 119, 53, 5, 101, 125, 121, 35,
29, 7, 63, 17, 63, 13, 69, 15, 105, 51,
127, 105, 9, 57, 95, 59, 109, 35, 49, 23,
33, 107, 55, 33, 57, 79, 73, 69, 59, 107,
55, 11, 63, 95, 103, 23, 125, 91, 31, 91,
51, 65, 61, 75, 69, 107, 65, 101, 59, 35,
15 } ;
static const int V7 [] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 7, 23, 39,
217, 141, 27, 53, 181, 169, 35, 15, 207, 45,
247, 185, 117, 41, 81, 223, 151, 81, 189, 61,
95, 185, 23, 73, 113, 239, 85, 9, 201, 83,
53, 183, 203, 91, 149, 101, 13, 111, 239, 3,
205, 253, 247, 121, 189, 169, 179, 197, 175, 217,
249, 195, 95, 63, 19, 7, 5, 75, 217, 245,
111, 189, 165, 169, 141, 221, 249, 159, 253, 207,
249, 219, 23, 49, 127, 237, 5, 25, 177, 37,
103, 65, 167, 81, 87, 119, 45, 79, 143, 57,
79, 187, 143, 183, 75, 97, 211, 149, 175, 37,
135, 189, 225, 241, 63, 33, 43, 13, 73, 213,
57, 239, 183, 117, 21, 29, 115, 43, 205, 223,
15, 3, 159, 51, 101, 127, 99, 239, 171, 113,
171, 119, 189, 245, 201, 27, 185, 229, 105, 153,
189, 33, 35, 137, 77, 97, 17, 181, 55, 197,
201, 155, 37, 197, 137, 223, 25, 179, 91, 23,
235, 53, 253, 49, 181, 249, 53, 173, 97, 247,
67, 115, 103, 159, 239, 69, 173, 217, 95, 221,
247, 97, 91, 123, 223, 213, 129, 181, 87, 239,
85, 89, 249, 141, 39, 57, 249, 71, 101, 159,
33, 137, 189, 71, 253, 205, 171, 13, 249, 109,
131, 199, 189, 179, 31, 99, 113, 41, 173, 23,
189, 197, 3, 135, 9, 95, 195, 27, 183, 1,
123, 73, 53, 99, 197, 59, 27, 101, 55, 193,
31, 61, 119, 11, 7, 255, 233, 53, 157, 193,
97, 83, 65, 81, 239, 167, 69, 71, 109, 97,
137, 71, 193, 189, 115, 79, 205, 37, 227, 53,
33, 91, 229, 245, 105, 77, 229, 161, 103, 93,
13, 161, 229, 223, 69, 15, 25, 23, 233, 93,
25, 217, 247, 61, 75, 27, 9, 223, 213, 55,
197, 145, 89, 199, 41, 201, 5, 149, 35, 119,
183, 53, 11, 13, 3, 179, 229, 43, 55, 187,
233, 47, 133, 91, 47, 71, 93, 105, 145, 45,
255, 221, 115, 175, 19, 129, 5, 209, 197, 57,
177, 115, 187, 119, 77, 211, 111, 33, 113, 23,
87, 137, 41, 7, 83, 43, 121, 145, 5, 219,
27, 11, 111, 207, 55, 97, 63, 229, 53, 33,
149, 23, 187, 153, 91, 193, 183, 59, 211, 93,
139, 59, 179, 163, 209, 77, 39, 111, 79, 229,
85, 237, 199, 137, 147, 25, 73, 121, 129, 83,
87, 93, 205, 167, 53, 107, 229, 213, 95, 219,
109, 175, 13, 209, 97, 61, 147, 19, 13, 123,
73, 35, 141, 81, 19, 171, 255, 111, 107, 233,
113, 133, 89, 9, 231, 95, 69, 33, 1, 253,
219, 253, 247, 129, 11, 251, 221, 153, 35, 103,
239, 7, 27, 235, 181, 5, 207, 53, 149, 155,
225, 165, 137, 155, 201, 97, 245, 203, 47, 39,
35, 105, 239, 49, 15, 253, 7, 237, 213, 55,
87, 199, 27, 175, 49, 41, 229, 85, 3, 149,
179, 129, 185, 249, 197, 15, 97, 197, 139, 203,
63, 33, 251, 217, 199, 199, 99, 249, 33, 229,
177, 13, 209, 147, 97, 31, 125, 177, 137, 187,
11, 91, 223, 29, 169, 231, 59, 31, 163, 41,
57, 87, 247, 25, 127, 101, 207, 187, 73, 61,
105, 27, 91, 171, 243, 33, 3, 1, 21, 229,
93, 71, 61, 37, 183, 65, 211, 53, 11, 151,
165, 47, 5, 129, 79, 101, 147, 169, 181, 19,
95, 77, 139, 197, 219, 97, 239, 183, 143, 9,
13, 209, 23, 215, 53, 137, 203, 19, 151, 171,
133, 219, 231, 3, 15, 253, 225, 33, 111, 183,
213, 169, 119, 111, 15, 201, 123, 121, 225, 113,
113, 225, 161, 165, 1, 139, 55, 3, 93, 217,
193, 97, 29, 69, 231, 161, 93, 69, 143, 137,
9, 87, 183, 113, 183, 73, 215, 137, 89, 251,
163, 41, 227, 145, 57, 81, 57, 11, 135, 145,
161, 175, 159, 25, 55, 167, 157, 211, 97, 247,
249, 23, 129, 159, 71, 197, 127, 141, 219, 5,
233, 131, 217, 101, 131, 33, 157, 173, 69, 207,
239, 81, 205, 11, 41, 169, 65, 193, 77, 201,
173, 1, 221, 157, 1, 15, 113, 147, 137, 205,
225, 73, 45, 49, 149, 113, 253, 99, 17, 119,
105, 117, 129, 243, 75, 203, 53, 29, 247, 35,
247, 171, 31, 199, 213, 29, 251, 7, 251, 187,
91, 11, 149, 13, 205, 37, 249, 137, 139, 9,
7, 113, 183, 205, 187, 39, 3, 79, 155, 227,
89, 185, 51, 127, 63, 83, 41, 133, 183, 181,
127, 19, 255, 219, 59, 251, 3, 187, 57, 217,
115, 217, 229, 181, 185, 149, 83, 115, 11, 123,
19, 109, 165, 103, 123, 219, 129, 155, 207, 177,
9, 49, 181, 231, 33, 233, 67, 155, 41, 9,
95, 123, 65, 117, 249, 85, 169, 129, 241, 173,
251, 225, 147, 165, 69, 81, 239, 95, 23, 83,
227, 249, 143, 171, 193, 9, 21, 57, 73, 97,
57, 29, 239, 151, 159, 191, 47, 51, 1, 223,
251, 251, 151, 41, 119, 127, 131, 33, 209, 123,
53, 241, 25, 31, 183, 107, 25, 115, 39, 11,
213, 239, 219, 109, 185, 35, 133, 123, 185, 27,
55, 245, 61, 75, 205, 213, 169, 163, 63, 55,
49, 83, 195, 51, 31, 41, 15, 203, 41, 63,
127, 161, 5, 143, 7, 199, 251, 95, 75, 101,
15, 43, 237, 197, 117, 167, 155, 21, 83, 205,
255, 49, 101, 213, 237, 135, 135, 21, 73, 93,
115, 7, 85, 223, 237, 79, 89, 5, 57, 239,
67, 65, 201, 155, 71, 85, 195, 89, 181, 119,
135, 147, 237, 173, 41, 155, 67, 113, 111, 21,
183, 23, 103, 207, 253, 69, 219, 205, 195, 43,
197, 229, 139, 177, 129, 69, 97, 201, 163, 189,
11, 99, 91, 253, 239, 91, 145, 19, 179, 231,
121, 7, 225, 237, 125, 191, 119, 59, 175, 237,
131, 79, 43, 45, 205, 199, 251, 153, 207, 37,
179, 113, 255, 107, 217, 61, 7, 181, 247, 31,
13, 113, 145, 107, 233, 233, 43, 79, 23, 169,
137, 129, 183, 53, 91, 55, 103, 223, 87, 177,
157, 79, 213, 139, 183, 231, 205, 143, 129, 243,
205, 93, 59, 15, 89, 9, 11, 47, 133, 227,
75, 9, 91, 19, 171, 163, 79, 7, 103, 5,
119, 155, 75, 11, 71, 95, 17, 13, 243, 207,
187 } ;
static const int V8 [] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 235, 307, 495, 417, 57, 151, 19,
119, 375, 451, 55, 449, 501, 53, 185, 317, 17,
21, 487, 13, 347, 393, 15, 391, 307, 189, 381,
71, 163, 99, 467, 167, 433, 337, 257, 179, 47,
385, 23, 117, 369, 425, 207, 433, 301, 147, 333,
85, 221, 423, 49, 3, 43, 229, 227, 201, 383,
281, 229, 207, 21, 343, 251, 397, 173, 507, 421,
443, 399, 53, 345, 77, 385, 317, 155, 187, 269,
501, 19, 169, 235, 415, 61, 247, 183, 5, 257,
401, 451, 95, 455, 49, 489, 75, 459, 377, 87,
463, 155, 233, 115, 429, 211, 419, 143, 487, 195,
209, 461, 193, 157, 193, 363, 181, 271, 445, 381,
231, 135, 327, 403, 171, 197, 181, 343, 113, 313,
393, 311, 415, 267, 247, 425, 233, 289, 55, 39,
247, 327, 141, 5, 189, 183, 27, 337, 341, 327,
87, 429, 357, 265, 251, 437, 201, 29, 339, 257,
377, 17, 53, 327, 47, 375, 393, 369, 403, 125,
429, 257, 157, 217, 85, 267, 117, 337, 447, 219,
501, 41, 41, 193, 509, 131, 207, 505, 421, 149,
111, 177, 167, 223, 291, 91, 29, 305, 151, 177,
337, 183, 361, 435, 307, 507, 77, 181, 507, 315,
145, 423, 71, 103, 493, 271, 469, 339, 237, 437,
483, 31, 219, 61, 131, 391, 233, 219, 69, 57,
459, 225, 421, 7, 461, 111, 451, 277, 185, 193,
125, 251, 199, 73, 71, 7, 409, 417, 149, 193,
53, 437, 29, 467, 229, 31, 35, 75, 105, 503,
75, 317, 401, 367, 131, 365, 441, 433, 93, 377,
405, 465, 259, 283, 443, 143, 445, 3, 461, 329,
309, 77, 323, 155, 347, 45, 381, 315, 463, 207,
321, 157, 109, 479, 313, 345, 167, 439, 307, 235,
473, 79, 101, 245, 19, 381, 251, 35, 25, 107,
187, 115, 113, 321, 115, 445, 61, 77, 293, 405,
13, 53, 17, 171, 299, 41, 79, 3, 485, 331,
13, 257, 59, 201, 497, 81, 451, 199, 171, 81,
253, 365, 75, 451, 149, 483, 81, 453, 469, 485,
305, 163, 401, 15, 91, 3, 129, 35, 239, 355,
211, 387, 101, 299, 67, 375, 405, 357, 267, 363,
79, 83, 437, 457, 39, 97, 473, 289, 179, 57,
23, 49, 79, 71, 341, 287, 95, 229, 271, 475,
49, 241, 261, 495, 353, 381, 13, 291, 37, 251,
105, 399, 81, 89, 265, 507, 205, 145, 331, 129,
119, 503, 249, 1, 289, 463, 163, 443, 63, 123,
361, 261, 49, 429, 137, 355, 175, 507, 59, 277,
391, 25, 185, 381, 197, 39, 5, 429, 119, 247,
177, 329, 465, 421, 271, 467, 151, 45, 429, 137,
471, 11, 17, 409, 347, 199, 463, 177, 11, 51,
361, 95, 497, 163, 351, 127, 395, 511, 327, 353,
49, 105, 151, 321, 331, 329, 509, 107, 109, 303,
467, 287, 161, 45, 385, 289, 363, 331, 265, 407,
37, 433, 315, 343, 63, 51, 185, 71, 27, 267,
503, 239, 293, 245, 281, 297, 75, 461, 371, 129,
189, 189, 339, 287, 111, 111, 379, 93, 27, 185,
347, 337, 247, 507, 161, 231, 43, 499, 73, 327,
263, 331, 249, 493, 37, 25, 115, 3, 167, 197,
127, 357, 497, 103, 125, 191, 165, 55, 101, 95,
79, 351, 341, 43, 125, 135, 173, 289, 373, 133,
421, 241, 281, 213, 177, 363, 151, 227, 145, 363,
239, 431, 81, 397, 241, 67, 291, 255, 405, 421,
399, 75, 399, 105, 329, 41, 425, 7, 283, 375,
475, 427, 277, 209, 411, 3, 137, 195, 289, 509,
121, 55, 147, 275, 251, 19, 129, 285, 415, 487,
491, 193, 219, 403, 23, 97, 65, 285, 75, 21,
373, 261, 339, 239, 495, 415, 333, 107, 435, 297,
213, 149, 463, 199, 323, 45, 19, 301, 121, 499,
187, 229, 63, 425, 99, 281, 35, 125, 349, 87,
101, 59, 195, 511, 355, 73, 263, 243, 101, 165,
141, 11, 389, 219, 187, 449, 447, 393, 477, 305,
221, 51, 355, 209, 499, 479, 265, 377, 145, 411,
173, 11, 433, 483, 135, 385, 341, 89, 209, 391,
33, 395, 319, 451, 119, 341, 227, 375, 61, 331,
493, 411, 293, 47, 203, 375, 167, 395, 155, 5,
237, 361, 489, 127, 21, 345, 101, 371, 233, 431,
109, 119, 277, 125, 263, 73, 135, 123, 83, 123,
405, 69, 75, 287, 401, 23, 283, 393, 41, 379,
431, 11, 475, 505, 19, 365, 265, 271, 499, 489,
443, 165, 91, 83, 291, 319, 199, 107, 245, 389,
143, 137, 89, 125, 281, 381, 215, 131, 299, 249,
375, 455, 43, 73, 281, 217, 297, 229, 431, 357,
81, 357, 171, 451, 481, 13, 387, 491, 489, 439,
385, 487, 177, 393, 33, 71, 375, 443, 129, 407,
395, 127, 65, 333, 309, 119, 197, 435, 497, 373,
71, 379, 509, 387, 159, 265, 477, 463, 449, 47,
353, 249, 335, 505, 89, 141, 55, 235, 187, 87,
363, 93, 363, 101, 67, 215, 321, 331, 305, 261,
411, 491, 479, 65, 307, 469, 415, 131, 315, 487,
83, 455, 19, 113, 163, 503, 99, 499, 251, 239,
81, 167, 391, 255, 317, 363, 359, 395, 419, 307,
251, 267, 171, 461, 183, 465, 165, 163, 293, 477,
223, 403, 389, 97, 335, 357, 297, 19, 469, 501,
249, 85, 213, 311, 265, 379, 297, 283, 393, 449,
463, 289, 159, 289, 499, 407, 129, 137, 221, 43,
89, 403, 271, 75, 83, 445, 453, 389, 149, 143,
423, 499, 317, 445, 157, 137, 453, 163, 87, 23,
391, 119, 427, 323, 173, 89, 259, 377, 511, 249,
31, 363, 229, 353, 329, 493, 427, 57, 205, 389,
91, 83, 13, 219, 439, 45, 35, 371, 441, 17,
267, 501, 53, 25, 333, 17, 201, 475, 257, 417,
345, 381, 377, 55, 403, 77, 389, 347, 363, 211,
413, 419, 5, 167, 219, 201, 285, 425, 11, 77,
269, 489, 281, 403, 79, 425, 125, 81, 331, 437,
271, 397, 299, 475, 271, 249, 413, 233, 261, 495,
171, 69, 27, 409, 21, 421, 367, 81, 483, 255,
15, 219, 365, 497, 181, 75, 431, 99, 325, 407,
229, 281, 63, 83, 493, 5, 113, 15, 271, 37,
87, 451, 299, 83, 451, 311, 441, 47, 455, 47,
253, 13, 109, 369, 347, 11, 409, 275, 63, 441,
15 } ;
static const int V9 [] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 519, 307, 931, 1023, 517, 771, 151, 1023, 539,
725, 45, 927, 707, 29, 125, 371, 275, 279, 817,
389, 453, 989, 1015, 29, 169, 743, 99, 923, 981,
181, 693, 309, 227, 111, 219, 897, 377, 425, 609,
227, 19, 221, 143, 581, 147, 919, 127, 725, 793,
289, 411, 835, 921, 957, 443, 349, 813, 5, 105,
457, 393, 539, 101, 197, 697, 27, 343, 515, 69,
485, 383, 855, 693, 133, 87, 743, 747, 475, 87,
469, 763, 721, 345, 479, 965, 527, 121, 271, 353,
467, 177, 245, 627, 113, 357, 7, 691, 725, 355,
889, 635, 737, 429, 545, 925, 357, 873, 187, 351,
677, 999, 921, 477, 233, 765, 495, 81, 953, 479,
89, 173, 473, 131, 961, 411, 291, 967, 65, 511,
13, 805, 945, 369, 827, 295, 163, 835, 259, 207,
331, 29, 315, 999, 133, 967, 41, 117, 677, 471,
717, 881, 755, 351, 723, 259, 879, 455, 721, 289,
149, 199, 805, 987, 851, 423, 597, 129, 11, 733,
549, 153, 285, 451, 559, 377, 109, 357, 143, 693,
615, 677, 701, 475, 767, 85, 229, 509, 547, 151,
389, 711, 785, 657, 319, 509, 99, 1007, 775, 359,
697, 677, 85, 497, 105, 615, 891, 71, 449, 835,
609, 377, 693, 665, 627, 215, 911, 503, 729, 131,
19, 895, 199, 161, 239, 633, 1013, 537, 255, 23,
149, 679, 1021, 595, 199, 557, 659, 251, 829, 727,
439, 495, 647, 223, 949, 625, 87, 481, 85, 799,
917, 769, 949, 739, 115, 499, 945, 547, 225, 1015,
469, 737, 495, 353, 103, 17, 665, 639, 525, 75,
447, 185, 43, 729, 577, 863, 735, 317, 99, 17,
477, 893, 537, 519, 1017, 375, 297, 325, 999, 353,
343, 729, 135, 489, 859, 267, 141, 831, 141, 893,
249, 807, 53, 613, 131, 547, 977, 131, 999, 175,
31, 341, 739, 467, 675, 241, 645, 247, 391, 583,
183, 973, 433, 367, 131, 467, 571, 309, 385, 977,
111, 917, 935, 473, 345, 411, 313, 97, 149, 959,
841, 839, 669, 431, 51, 41, 301, 247, 1015, 377,
329, 945, 269, 67, 979, 581, 643, 823, 557, 91,
405, 117, 801, 509, 347, 893, 303, 227, 783, 555,
867, 99, 703, 111, 797, 873, 541, 919, 513, 343,
319, 517, 135, 871, 917, 285, 663, 301, 15, 763,
89, 323, 757, 317, 807, 309, 1013, 345, 499, 279,
711, 915, 411, 281, 193, 739, 365, 315, 375, 809,
469, 487, 621, 857, 975, 537, 939, 585, 129, 625,
447, 129, 1017, 133, 83, 3, 415, 661, 53, 115,
903, 49, 79, 55, 385, 261, 345, 297, 199, 385,
617, 25, 515, 275, 849, 401, 471, 377, 661, 535,
505, 939, 465, 225, 929, 219, 955, 659, 441, 117,
527, 427, 515, 287, 191, 33, 389, 197, 825, 63,
417, 949, 35, 571, 9, 131, 609, 439, 95, 19,
569, 893, 451, 397, 971, 801, 125, 471, 187, 257,
67, 949, 621, 453, 411, 621, 955, 309, 783, 893,
597, 377, 753, 145, 637, 941, 593, 317, 555, 375,
575, 175, 403, 571, 555, 109, 377, 931, 499, 649,
653, 329, 279, 271, 647, 721, 665, 429, 957, 803,
767, 425, 477, 995, 105, 495, 575, 687, 385, 227,
923, 563, 723, 481, 717, 111, 633, 113, 369, 955,
253, 321, 409, 909, 367, 33, 967, 453, 863, 449,
539, 781, 911, 113, 7, 219, 725, 1015, 971, 1021,
525, 785, 873, 191, 893, 297, 507, 215, 21, 153,
645, 913, 755, 371, 881, 113, 903, 225, 49, 587,
201, 927, 429, 599, 513, 97, 319, 331, 833, 325,
887, 139, 927, 399, 163, 307, 803, 169, 1019, 869,
537, 907, 479, 335, 697, 479, 353, 769, 787, 1023,
855, 493, 883, 521, 735, 297, 1011, 991, 879, 855,
591, 415, 917, 375, 453, 553, 189, 841, 339, 211,
601, 57, 765, 745, 621, 209, 875, 639, 7, 595,
971, 263, 1009, 201, 23, 77, 621, 33, 535, 963,
661, 523, 263, 917, 103, 623, 231, 47, 301, 549,
337, 675, 189, 357, 1005, 789, 189, 319, 721, 1005,
525, 675, 539, 191, 813, 917, 51, 167, 415, 579,
755, 605, 721, 837, 529, 31, 327, 799, 961, 279,
409, 847, 649, 241, 285, 545, 407, 161, 591, 73,
313, 811, 17, 663, 269, 261, 37, 783, 127, 917,
231, 577, 975, 793, 921, 343, 751, 139, 221, 79,
817, 393, 545, 11, 781, 71, 1, 699, 767, 917,
9, 107, 341, 587, 903, 965, 599, 507, 843, 739,
579, 397, 397, 325, 775, 565, 925, 75, 55, 979,
931, 93, 957, 857, 753, 965, 795, 67, 5, 87,
909, 97, 995, 271, 875, 671, 613, 33, 351, 69,
811, 669, 729, 401, 647, 241, 435, 447, 721, 271,
745, 53, 775, 99, 343, 451, 427, 593, 339, 845,
243, 345, 17, 573, 421, 517, 971, 499, 435, 769,
75, 203, 793, 985, 343, 955, 735, 523, 659, 703,
303, 421, 951, 405, 631, 825, 735, 433, 841, 485,
49, 749, 107, 669, 211, 497, 143, 99, 57, 277,
969, 107, 397, 563, 551, 447, 381, 187, 57, 405,
731, 769, 923, 955, 915, 737, 595, 341, 253, 823,
197, 321, 315, 181, 885, 497, 159, 571, 981, 899,
785, 947, 217, 217, 135, 753, 623, 565, 717, 903,
581, 955, 621, 361, 869, 87, 943, 907, 853, 353,
335, 197, 771, 433, 743, 195, 91, 1023, 63, 301,
647, 205, 485, 927, 1003, 987, 359, 577, 147, 141,
1017, 701, 273, 89, 589, 487, 859, 343, 91, 847,
341, 173, 287, 1003, 289, 639, 983, 685, 697, 35,
701, 645, 911, 501, 705, 873, 763, 745, 657, 559,
699, 315, 347, 429, 197, 165, 955, 859, 167, 303,
833, 531, 473, 635, 641, 195, 589, 821, 205, 3,
635, 371, 891, 249, 123, 77, 623, 993, 401, 525,
427, 71, 655, 951, 357, 851, 899, 535, 493, 323,
1003, 343, 515, 859, 1017, 5, 423, 315, 1011, 703,
41, 777, 163, 95, 831, 79, 975, 235, 633, 723,
297, 589, 317, 679, 981, 195, 399, 1003, 121, 501,
155 } ;
static const int V10 [] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 7, 2011, 1001, 49, 825, 415, 1441, 383, 1581,
623, 1621, 1319, 1387, 619, 839, 217, 75, 1955, 505,
281, 1629, 1379, 53, 1111, 1399, 301, 209, 49, 155,
1647, 631, 129, 1569, 335, 67, 1955, 1611, 2021, 1305,
121, 37, 877, 835, 1457, 669, 1405, 935, 1735, 665,
551, 789, 1543, 1267, 1027, 1, 1911, 163, 1929, 67,
1975, 1681, 1413, 191, 1711, 1307, 401, 725, 1229, 1403,
1609, 2035, 917, 921, 1789, 41, 2003, 187, 67, 1635,
717, 1449, 277, 1903, 1179, 363, 1211, 1231, 647, 1261,
1029, 1485, 1309, 1149, 317, 1335, 171, 243, 271, 1055,
1601, 1129, 1653, 205, 1463, 1681, 1621, 197, 951, 573,
1697, 1265, 1321, 1805, 1235, 1853, 1307, 945, 1197, 1411,
833, 273, 1517, 1747, 1095, 1345, 869, 57, 1383, 221,
1713, 335, 1751, 1141, 839, 523, 1861, 1105, 389, 1177,
1877, 805, 93, 1591, 423, 1835, 99, 1781, 1515, 1909,
1011, 303, 385, 1635, 357, 973, 1781, 1707, 1363, 1053,
649, 1469, 623, 1429, 1241, 1151, 1055, 503, 921, 3,
349, 1149, 293, 45, 303, 877, 1565, 1583, 1001, 663,
1535, 395, 1141, 1481, 1797, 643, 1507, 465, 2027, 1695,
367, 937, 719, 545, 1991, 83, 819, 239, 1791, 1461,
1647, 1501, 1161, 1629, 139, 1595, 1921, 1267, 1415, 509,
347, 777, 1083, 363, 269, 1015, 1809, 1105, 1429, 1471,
2019, 381, 2025, 1223, 827, 1733, 887, 1321, 803, 1951,
1297, 1995, 833, 1107, 1135, 1181, 1251, 983, 1389, 1565,
273, 137, 71, 735, 1005, 933, 67, 1471, 551, 457,
1667, 1729, 919, 285, 1629, 1815, 653, 1919, 1039, 531,
393, 1411, 359, 221, 699, 1485, 471, 1357, 1715, 595,
1677, 153, 1903, 1281, 215, 781, 543, 293, 1807, 965,
1695, 443, 1985, 321, 879, 1227, 1915, 839, 1945, 1993,
1165, 51, 557, 723, 1491, 817, 1237, 947, 1215, 1911,
1225, 1965, 1889, 1503, 1177, 73, 1767, 303, 177, 1897,
1401, 321, 921, 217, 1779, 327, 1889, 333, 615, 1665,
1825, 1639, 237, 1205, 361, 129, 1655, 983, 1089, 1171,
401, 677, 643, 749, 303, 1407, 1873, 1579, 1491, 1393,
1247, 789, 763, 49, 5, 1607, 1891, 735, 1557, 1909,
1765, 1777, 1127, 813, 695, 97, 731, 1503, 1751, 333,
769, 865, 693, 377, 1919, 957, 1359, 1627, 1039, 1783,
1065, 1665, 1917, 1947, 991, 1997, 841, 459, 221, 327,
1595, 1881, 1269, 1007, 129, 1413, 475, 1105, 791, 1983,
1359, 503, 691, 659, 691, 343, 1375, 1919, 263, 1373,
603, 1383, 297, 781, 145, 285, 767, 1739, 1715, 715,
317, 1333, 85, 831, 1615, 81, 1667, 1467, 1457, 1453,
1825, 109, 387, 1207, 2039, 213, 1351, 1329, 1173, 57,
1769, 951, 183, 23, 451, 1155, 1551, 2037, 811, 635,
1671, 1451, 863, 1499, 1673, 363, 1029, 1077, 1525, 277,
1023, 655, 665, 1869, 1255, 965, 277, 1601, 329, 1603,
1901, 395, 65, 1307, 2029, 21, 1321, 543, 1569, 1185,
1905, 1701, 413, 2041, 1697, 725, 1417, 1847, 411, 211,
915, 1891, 17, 1877, 1699, 687, 1089, 1973, 1809, 851,
1495, 1257, 63, 1323, 1307, 609, 881, 1543, 177, 617,
1505, 1747, 1537, 925, 183, 77, 1723, 1877, 1703, 397,
459, 521, 257, 1177, 389, 1947, 1553, 1583, 1831, 261,
485, 289, 1281, 1543, 1591, 1123, 573, 821, 1065, 1933,
1373, 2005, 905, 207, 173, 1573, 1597, 573, 1883, 1795,
1499, 1743, 553, 335, 333, 1645, 791, 871, 1157, 969,
557, 141, 223, 1129, 1685, 423, 1069, 391, 99, 95,
1847, 531, 1859, 1833, 1833, 341, 237, 1997, 1799, 409,
431, 1917, 363, 335, 1039, 1085, 1657, 1975, 1527, 1111,
659, 389, 899, 595, 1439, 1861, 1979, 1569, 1087, 1009,
165, 1895, 1481, 1583, 29, 1193, 1673, 1075, 301, 1081,
1377, 1747, 1497, 1103, 1789, 887, 739, 1577, 313, 1367,
1299, 1801, 1131, 1837, 73, 1865, 1065, 843, 635, 55,
1655, 913, 1037, 223, 1871, 1161, 461, 479, 511, 1721,
1107, 389, 151, 35, 375, 1099, 937, 1185, 1701, 769,
639, 1633, 1609, 379, 1613, 2031, 685, 289, 975, 671,
1599, 1447, 871, 647, 99, 139, 1427, 959, 89, 117,
841, 891, 1959, 223, 1697, 1145, 499, 1435, 1809, 1413,
1445, 1675, 171, 1073, 1349, 1545, 2039, 1027, 1563, 859,
215, 1673, 1919, 1633, 779, 411, 1845, 1477, 1489, 447,
1545, 351, 1989, 495, 183, 1639, 1385, 1805, 1097, 1249,
1431, 1571, 591, 697, 1509, 709, 31, 1563, 165, 513,
1425, 1299, 1081, 145, 1841, 1211, 941, 609, 845, 1169,
1865, 1593, 347, 293, 1277, 157, 211, 93, 1679, 1799,
527, 41, 473, 563, 187, 1525, 575, 1579, 857, 703,
1211, 647, 709, 981, 285, 697, 163, 981, 153, 1515,
47, 1553, 599, 225, 1147, 381, 135, 821, 1965, 609,
1033, 983, 503, 1117, 327, 453, 2005, 1257, 343, 1649,
1199, 599, 1877, 569, 695, 1587, 1475, 187, 973, 233,
511, 51, 1083, 665, 1321, 531, 1875, 1939, 859, 1507,
1979, 1203, 1965, 737, 921, 1565, 1943, 819, 223, 365,
167, 1705, 413, 1577, 745, 1573, 655, 1633, 1003, 91,
1123, 477, 1741, 1663, 35, 715, 37, 1513, 815, 941,
1379, 263, 1831, 1735, 1111, 1449, 353, 1941, 1655, 1349,
877, 285, 1723, 125, 1753, 985, 723, 175, 439, 791,
1051, 1261, 717, 1555, 1757, 1777, 577, 1583, 1957, 873,
331, 1163, 313, 1, 1963, 963, 1905, 821, 1677, 185,
709, 545, 1723, 215, 1885, 1249, 583, 1803, 839, 885,
485, 413, 1767, 425, 129, 1035, 329, 1263, 1881, 1779,
1565, 359, 367, 453, 707, 1419, 831, 1889, 887, 1871,
1869, 747, 223, 1547, 1799, 433, 1441, 553, 2021, 1303,
1505, 1735, 1619, 1065, 1161, 2047, 347, 867, 881, 1447,
329, 781, 1065, 219, 589, 645, 1257, 1833, 749, 1841,
1733, 1179, 1191, 1025, 1639, 1955, 1423, 1685, 1711, 493,
549, 783, 1653, 397, 895, 233, 759, 1505, 677, 1449,
1573, 1297, 1821, 1691, 791, 289, 1187, 867, 1535, 575,
183 } ;
static const int V11 [] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 3915, 97, 3047,
937, 2897, 953, 127, 1201, 3819, 193, 2053, 3061, 3759,
1553, 2007, 2493, 603, 3343, 3751, 1059, 783, 1789, 1589,
283, 1093, 3919, 2747, 277, 2605, 2169, 2905, 721, 4069,
233, 261, 1137, 3993, 3619, 2881, 1275, 3865, 1299, 3757,
1193, 733, 993, 1153, 2945, 3163, 3179, 437, 271, 3493,
3971, 1005, 2615, 2253, 1131, 585, 2775, 2171, 2383, 2937,
2447, 1745, 663, 1515, 3767, 2709, 1767, 3185, 3017, 2815,
1829, 87, 3341, 793, 2627, 2169, 1875, 3745, 367, 3783,
783, 827, 3253, 2639, 2955, 3539, 1579, 2109, 379, 2939,
3019, 1999, 2253, 2911, 3733, 481, 1767, 1055, 4019, 4085,
105, 1829, 2097, 2379, 1567, 2713, 737, 3423, 3941, 2659,
3961, 1755, 3613, 1937, 1559, 2287, 2743, 67, 2859, 325,
2601, 1149, 3259, 2403, 3947, 2011, 175, 3389, 3915, 1315,
2447, 141, 359, 3609, 3933, 729, 2051, 1755, 2149, 2107,
1741, 1051, 3681, 471, 1055, 845, 257, 1559, 1061, 2803,
2219, 1315, 1369, 3211, 4027, 105, 11, 1077, 2857, 337,
3553, 3503, 3917, 2665, 3823, 3403, 3711, 2085, 1103, 1641,
701, 4095, 2883, 1435, 653, 2363, 1597, 767, 869, 1825,
1117, 1297, 501, 505, 149, 873, 2673, 551, 1499, 2793,
3277, 2143, 3663, 533, 3991, 575, 1877, 1009, 3929, 473,
3009, 2595, 3249, 675, 3593, 2453, 1567, 973, 595, 1335,
1715, 589, 85, 2265, 3069, 461, 1659, 2627, 1307, 1731,
1501, 1699, 3545, 3803, 2157, 453, 2813, 2047, 2999, 3841,
2361, 1079, 573, 69, 1363, 1597, 3427, 2899, 2771, 1327,
1117, 1523, 3521, 2393, 2537, 1979, 3179, 683, 2453, 453,
1227, 779, 671, 3483, 2135, 3139, 3381, 3945, 57, 1541,
3405, 3381, 2371, 2879, 1985, 987, 3017, 3031, 3839, 1401,
3749, 2977, 681, 1175, 1519, 3355, 907, 117, 771, 3741,
3337, 1743, 1227, 3335, 2755, 1909, 3603, 2397, 653, 87,
2025, 2617, 3257, 287, 3051, 3809, 897, 2215, 63, 2043,
1757, 3671, 297, 3131, 1305, 293, 3865, 3173, 3397, 2269,
3673, 717, 3041, 3341, 3595, 3819, 2871, 3973, 1129, 513,
871, 1485, 3977, 2473, 1171, 1143, 3063, 3547, 2183, 3993,
133, 2529, 2699, 233, 2355, 231, 3241, 611, 1309, 3829,
1839, 1495, 301, 1169, 1613, 2673, 243, 3601, 3669, 2813,
2671, 2679, 3463, 2477, 1795, 617, 2317, 1855, 1057, 1703,
1761, 2515, 801, 1205, 1311, 473, 3963, 697, 1221, 251,
381, 3887, 1761, 3093, 3721, 2079, 4085, 379, 3601, 3845,
433, 1781, 29, 1897, 1599, 2163, 75, 3475, 3957, 1641,
3911, 2959, 2833, 1279, 1099, 403, 799, 2183, 2699, 1711,
2037, 727, 289, 1785, 1575, 3633, 2367, 1261, 3953, 1735,
171, 1959, 2867, 859, 2951, 3211, 15, 1279, 1323, 599,
1651, 3951, 1011, 315, 3513, 3351, 1725, 3793, 2399, 287,
4017, 3571, 1007, 541, 3115, 429, 1585, 1285, 755, 1211,
3047, 915, 3611, 2697, 2129, 3669, 81, 3939, 2437, 915,
779, 3567, 3701, 2479, 3807, 1893, 3927, 2619, 2543, 3633,
2007, 3857, 3837, 487, 1769, 3759, 3105, 2727, 3155, 2479,
1341, 1657, 2767, 2541, 577, 2105, 799, 17, 2871, 3637,
953, 65, 69, 2897, 3841, 3559, 4067, 2335, 3409, 1087,
425, 2813, 1705, 1701, 1237, 821, 1375, 3673, 2693, 3925,
1541, 1871, 2285, 847, 4035, 1101, 2029, 855, 2733, 2503,
121, 2855, 1069, 3463, 3505, 1539, 607, 1349, 575, 2301,
2321, 1101, 333, 291, 2171, 4085, 2173, 2541, 1195, 925,
4039, 1379, 699, 1979, 275, 953, 1755, 1643, 325, 101,
2263, 3329, 3673, 3413, 1977, 2727, 2313, 1419, 887, 609,
2475, 591, 2613, 2081, 3805, 3435, 2409, 111, 3557, 3607,
903, 231, 3059, 473, 2959, 2925, 3861, 2043, 3887, 351,
2865, 369, 1377, 2639, 1261, 3625, 3279, 2201, 2949, 3049,
449, 1297, 897, 1891, 411, 2773, 749, 2753, 1825, 853,
2775, 3547, 3923, 3923, 987, 3723, 2189, 3877, 3577, 297,
2763, 1845, 3083, 2951, 483, 2169, 3985, 245, 3655, 3441,
1023, 235, 835, 3693, 3585, 327, 1003, 543, 3059, 2637,
2923, 87, 3617, 1031, 1043, 903, 2913, 2177, 2641, 3279,
389, 2009, 525, 4085, 3299, 987, 2409, 813, 2683, 373,
2695, 3775, 2375, 1119, 2791, 223, 325, 587, 1379, 2877,
2867, 3793, 655, 831, 3425, 1663, 1681, 2657, 1865, 3943,
2977, 1979, 2271, 3247, 1267, 1747, 811, 159, 429, 2001,
1195, 3065, 553, 1499, 3529, 1081, 2877, 3077, 845, 1793,
2409, 3995, 2559, 4081, 1195, 2955, 1117, 1409, 785, 287,
1521, 1607, 85, 3055, 3123, 2533, 2329, 3477, 799, 3683,
3715, 337, 3139, 3311, 431, 3511, 2299, 365, 2941, 3067,
1331, 1081, 1097, 2853, 2299, 495, 1745, 749, 3819, 619,
1059, 3559, 183, 3743, 723, 949, 3501, 733, 2599, 3983,
3961, 911, 1899, 985, 2493, 1795, 653, 157, 433, 2361,
3093, 3119, 3679, 2367, 1701, 1445, 1321, 2397, 1241, 3305,
3985, 2349, 4067, 3805, 3073, 2837, 1567, 3783, 451, 2441,
1181, 487, 543, 1201, 3735, 2517, 733, 1535, 2175, 3613,
3019 } ;
static const int V12 [] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 2319, 653, 1379, 1675, 1951, 7075, 2087, 7147, 1427,
893, 171, 2019, 7235, 5697, 3615, 1961, 7517, 6849, 2893,
1883, 2863, 2173, 4543, 73, 381, 3893, 6045, 1643, 7669,
1027, 1549, 3983, 1985, 6589, 7497, 2745, 2375, 7047, 1117,
1171, 1975, 5199, 3915, 3695, 8113, 4303, 3773, 7705, 6855,
1675, 2245, 2817, 1719, 569, 1021, 2077, 5945, 1833, 2631,
4851, 6371, 833, 7987, 331, 1899, 8093, 6719, 6903, 5903,
5657, 5007, 2689, 6637, 2675, 1645, 1819, 689, 6709, 7717,
6295, 7013, 7695, 3705, 7069, 2621, 3631, 6571, 6259, 7261,
3397, 7645, 1115, 4753, 2047, 7579, 2271, 5403, 4911, 7629,
4225, 1209, 6955, 6951, 1829, 5579, 5231, 1783, 4285, 7425,
599, 5785, 3275, 5643, 2263, 657, 6769, 6261, 1251, 3249,
4447, 4111, 3991, 1215, 131, 4397, 3487, 7585, 5565, 7199,
3573, 7105, 7409, 1671, 949, 3889, 5971, 3333, 225, 3647,
5403, 3409, 7459, 6879, 5789, 6567, 5581, 4919, 1927, 4407,
8085, 4691, 611, 3005, 591, 753, 589, 171, 5729, 5891,
1033, 3049, 6567, 5257, 8003, 1757, 4489, 4923, 6379, 5171,
1757, 689, 3081, 1389, 4113, 455, 2761, 847, 7575, 5829,
633, 6629, 1103, 7635, 803, 6175, 6587, 2711, 3879, 67,
1179, 4761, 7281, 1557, 3379, 2459, 4273, 4127, 7147, 35,
3549, 395, 3735, 5787, 4179, 5889, 5057, 7473, 4713, 2133,
2897, 1841, 2125, 1029, 1695, 6523, 1143, 5105, 7133, 3351,
2775, 3971, 4503, 7589, 5155, 4305, 1641, 4717, 2427, 5617,
1267, 399, 5831, 4305, 4241, 3395, 3045, 4899, 1713, 171,
411, 7099, 5473, 5209, 1195, 1077, 1309, 2953, 7343, 4887,
3229, 6759, 6721, 6775, 675, 4039, 2493, 7511, 3269, 4199,
6625, 7943, 2013, 4145, 667, 513, 2303, 4591, 7941, 2741,
987, 8061, 3161, 5951, 1431, 831, 5559, 7405, 1357, 4319,
4235, 5421, 2559, 4415, 2439, 823, 1725, 6219, 4903, 6699,
5451, 349, 7703, 2927, 7809, 6179, 1417, 5987, 3017, 4983,
3479, 4525, 4643, 4911, 227, 5475, 2287, 5581, 6817, 1937,
1421, 4415, 7977, 1789, 3907, 6815, 6789, 6003, 5609, 4507,
337, 7427, 7943, 3075, 6427, 1019, 7121, 4763, 81, 3587,
2929, 1795, 8067, 2415, 1265, 4025, 5599, 4771, 3025, 2313,
6129, 7611, 6881, 5253, 4413, 7869, 105, 3173, 1629, 2537,
1023, 4409, 7209, 4413, 7107, 7469, 33, 1955, 2881, 5167,
6451, 4211, 179, 5573, 7879, 3387, 7759, 5455, 7157, 1891,
5683, 5689, 6535, 3109, 6555, 6873, 1249, 4251, 6437, 49,
2745, 1201, 7327, 4179, 6783, 623, 2779, 5963, 2585, 6927,
5333, 4033, 285, 7467, 4443, 4917, 3, 4319, 5517, 3449,
813, 5499, 2515, 5771, 3357, 2073, 4395, 4925, 2643, 7215,
5817, 1199, 1597, 1619, 7535, 4833, 609, 4797, 8171, 6847,
793, 6757, 8165, 3371, 2431, 5235, 4739, 7703, 7223, 6525,
5891, 5605, 4433, 3533, 5267, 5125, 5037, 225, 6717, 1121,
5741, 2013, 4327, 4839, 569, 5227, 7677, 4315, 2391, 5551,
859, 3627, 6377, 3903, 4311, 6527, 7573, 4905, 7731, 1909,
1555, 3279, 1949, 1887, 6675, 5509, 2033, 5473, 3539, 5033,
5935, 6095, 4761, 1771, 1271, 1717, 4415, 5083, 6277, 3147,
7695, 2461, 4783, 4539, 5833, 5583, 651, 1419, 2605, 5511,
3913, 5795, 2333, 2329, 4431, 3725, 6069, 2699, 7055, 6879,
1017, 3121, 2547, 4603, 2385, 6915, 6103, 5669, 7833, 2001,
4287, 6619, 955, 2761, 5711, 6291, 3415, 3909, 2841, 5627,
4939, 7671, 6059, 6275, 6517, 1931, 4583, 7301, 1267, 7509,
1435, 2169, 6939, 3515, 2985, 2787, 2123, 1969, 3307, 353,
4359, 7059, 5273, 5873, 6657, 6765, 6229, 3179, 1583, 6237,
2155, 371, 273, 7491, 3309, 6805, 3015, 6831, 7819, 713,
4747, 3935, 4109, 1311, 709, 3089, 7059, 4247, 2989, 1509,
4919, 1841, 3045, 3821, 6929, 4655, 1333, 6429, 6649, 2131,
5265, 1051, 261, 8057, 3379, 2179, 1993, 5655, 3063, 6381,
3587, 7417, 1579, 1541, 2107, 5085, 2873, 6141, 955, 3537,
2157, 841, 1999, 1465, 5171, 5651, 1535, 7235, 4349, 1263,
1453, 1005, 6893, 2919, 1947, 1635, 3963, 397, 969, 4569,
655, 6737, 2995, 7235, 7713, 973, 4821, 2377, 1673, 1,
6541 } ;
static void copyVector(int v[DIM_MAX2][LOG_MAX], size_t idx, const int vec[]) {
for ( size_t i(0); i < DIM_MAX2; i++ ) {
v[i][idx] = vec[i] ;
}
}
template<>
void Sobol::initializeV ( int v[DIM_MAX2][LOG_MAX] ) {
copyVector(v, 1, V1) ;
copyVector(v, 2, V2) ;
copyVector(v, 3, V3) ;
copyVector(v, 4, V4) ;
copyVector(v, 5, V5) ;
copyVector(v, 6, V6) ;
copyVector(v, 7, V7) ;
copyVector(v, 8, V8) ;
copyVector(v, 9, V9) ;
copyVector(v, 10, V10) ;
copyVector(v, 11, V11) ;
copyVector(v, 12, V12) ;
}
static void copyVector(long long v[DIM_MAX2][LOG_MAX], size_t idx, const int vec[]) {
for ( size_t i(0); i < DIM_MAX2; i++ ) {
v[i][idx] = vec[i] ;
}
}
template<>
void Sobol::initializeV ( long long v[DIM_MAX2][LOG_MAX] ) {
copyVector(v, 1, V1) ;
copyVector(v, 2, V2) ;
copyVector(v, 3, V3) ;
copyVector(v, 4, V4) ;
copyVector(v, 5, V5) ;
copyVector(v, 6, V6) ;
copyVector(v, 7, V7) ;
copyVector(v, 8, V8) ;
copyVector(v, 9, V9) ;
copyVector(v, 10, V10) ;
copyVector(v, 11, V11) ;
copyVector(v, 12, V12) ;
}
float *Sobol::i4_sobol_generate ( int m, int n, int skip )
//****************************************************************************80
//
// Purpose:
//
// I4_SOBOL_GENERATE generates a Sobol dataset.
//
// Licensing:
//
// This code is distributed under the GNU LGPL license.
//
// Modified:
//
// 12 December 2009
//
// Author:
//
// John Burkardt
//
// Parameters:
//
// Input, int M, the spatial dimension.
//
// Input, int N, the number of points to generate.
//
// Input, int SKIP, the number of initial points to skip.
//
// Output, float I4_SOBOL_GENERATE[M*N], the points.
//
{
int j;
float *r;
int seed;
r = new float[m*n];
seed = skip;
for ( j = 0; j < n; j++ )
{
// i4_sobol ( m, &seed, r+m*j );
}
return r;
}
//****************************************************************************80
int Sobol::i4_uniform ( int a, int b, int *seed )
//****************************************************************************80
//
// Purpose:
//
// I4_UNIFORM returns a scaled pseudorandom I4.
//
// Discussion:
//
// The pseudorandom number should be uniformly distributed
// between A and B.
//
// Licensing:
//
// This code is distributed under the GNU LGPL license.
//
// Modified:
//
// 12 November 2006
//
// Author:
//
// John Burkardt
//
// Reference:
//
// Paul Bratley, Bennett Fox, Linus Schrage,
// A Guide to Simulation,
// Springer Verlag, pages 201-202, 1983.
//
// Pierre L'Ecuyer,
// Random Number Generation,
// in Handbook of Simulation,
// edited by Jerry Banks,
// Wiley Interscience, page 95, 1998.
//
// Bennett Fox,
// Algorithm 647:
// Implementation and Relative Efficiency of Quasirandom
// Sequence Generators,
// ACM Transactions on Mathematical Software,
// Volume 12, Number 4, pages 362-376, 1986.
//
// Peter Lewis, Allen Goodman, James Miller
// A Pseudo-Random Number Generator for the System/360,
// IBM Systems Journal,
// Volume 8, pages 136-143, 1969.
//
// Parameters:
//
// Input, int A, B, the limits of the interval.
//
// Input/output, int *SEED, the "seed" value, which should NOT be 0.
// On output, SEED has been updated.
//
// Output, int I4_UNIFORM, a number between A and B.
//
{
int k;
double r;
int value;
if ( *seed == 0 )
{
cerr << "\n";
cerr << "I4_UNIFORM - Fatal error!\n";
cerr << " Input value of SEED = 0.\n";
exit ( 1 );
}
k = *seed / 127773;
*seed = 16807 * ( *seed - k * 127773 ) - k * 2836;
if ( *seed < 0 )
{
*seed = *seed + 2147483647;
}
r = double( *seed ) * 4.656612875E-10;
//
// Scale R to lie between A-0.5 and B+0.5.
//
r = ( 1.0 - r ) * ( double(min( a, b )) - 0.5 )
+ r * ( double(max( a, b )) + 0.5 );
//
// Use rounding to convert R to an integer between A and B.
//
value = nint ( r );
value = max( value, min( a, b ) );
value = min( value, max( a, b ) );
return value;
}
//****************************************************************************80
double *Sobol::i8_sobol_generate ( int m, int n, int skip )
//****************************************************************************80
//
// Purpose:
//
// I8_SOBOL_GENERATE generates a Sobol dataset.
//
// Licensing:
//
// This code is distributed under the GNU LGPL license.
//
// Modified:
//
// 12 December 2009
//
// Author:
//
// John Burkardt
//
// Parameters:
//
// Input, int M, the spatial dimension.
//
// Input, int N, the number of points to generate.
//
// Input, int SKIP, the number of initial points to skip.
//
// Output, double I8_SOBOL_GENERATE[M*N], the points.
//
{
int j;
double *r;
long long int seed;
r = new double[m*n];
seed = ( long long ) skip;
for ( j = 0; j < n; j++ )
{
// i8_sobol ( m, &seed, r+m*j );
}
return r;
}
//****************************************************************************80
long long int Sobol::i8_uniform ( long long int a, long long int b, int *seed )
//****************************************************************************80
//
// Purpose:
//
// I8_UNIFORM returns a scaled pseudorandom I8.
//
// Discussion:
//
// The pseudorandom number should be uniformly distributed
// between A and B.
//
// Licensing:
//
// This code is distributed under the GNU LGPL license.
//
// Modified:
//
// 12 May 2007
//
// Author:
//
// John Burkardt
//
// Reference:
//
// Paul Bratley, Bennett Fox, Linus Schrage,
// A Guide to Simulation,
// Springer Verlag, pages 201-202, 1983.
//
// Pierre L'Ecuyer,
// Random Number Generation,
// in Handbook of Simulation,
// edited by Jerry Banks,
// Wiley Interscience, page 95, 1998.
//
// Bennett Fox,
// Algorithm 647:
// Implementation and Relative Efficiency of Quasirandom
// Sequence Generators,
// ACM Transactions on Mathematical Software,
// Volume 12, Number 4, pages 362-376, 1986.
//
// Peter Lewis, Allen Goodman, James Miller
// A Pseudo-Random Number Generator for the System/360,
// IBM Systems Journal,
// Volume 8, pages 136-143, 1969.
//
// Parameters:
//
// Input, long long int A, B, the limits of the interval.
//
// Input/output, int *SEED, the "seed" value, which should NOT be 0.
// On output, SEED has been updated.
//
// Output, long long int I8_UNIFORM, a number between A and B.
//
{
long long int k;
double r;
long long int value;
if ( *seed == 0 )
{
cerr << "\n";
cerr << "I8_UNIFORM - Fatal error!\n";
cerr << " Input value of SEED = 0.\n";
exit ( 1 );
}
k = *seed / 127773;
*seed = int(16807 * ( *seed - k * 127773 ) - k * 2836) ;
if ( *seed < 0 )
{
*seed = *seed + 2147483647;
}
r = ( double ) ( *seed ) * 4.656612875E-10;
//
// Scale R to lie between A-0.5 and B+0.5.
//
r = ( 1.0 - r ) * ( ( double ) ( min( a, b ) ) - 0.5 )
+ r * ( ( double ) ( max( a, b ) ) + 0.5 );
//
// Use rounding to convert R to an integer between A and B.
//
value = nint ( r );
value = max( value, min( a, b ) );
value = min( value, max( a, b ) );
return value;
}
//****************************************************************************80
template<class T>
int Sobol::nint ( T x )
//****************************************************************************80
//
// Purpose:
//
// NINT returns the nearest integer.
//
// Example:
//
// X NINT
//
// 1.3 1
// 1.4 1
// 1.5 1 or 2
// 1.6 2
// 0.0 0
// -0.7 -1
// -1.1 -1
// -1.6 -2
//
// Licensing:
//
// This code is distributed under the GNU LGPL license.
//
// Modified:
//
// 14 November 2006
//
// Author:
//
// John Burkardt
//
// Parameters:
//
// Input, float X, the value.
//
// Output, int NINT, the nearest integer to X.
//
{
int value( int(fabs( x ) + 0.5) );
return ( x < 0.0 ) ? -value : value ;
}
//****************************************************************************80
float Sobol::r4_uniform_01 ( int *seed )
//****************************************************************************80
//
// Purpose:
//
// R4_UNIFORM_01 returns a unit pseudorandom R4.
//
// Discussion:
//
// This routine implements the recursion
//
// seed = 16807 * seed mod ( 2**31 - 1 )
// r4_uniform_01 = seed / ( 2**31 - 1 )
//
// The integer arithmetic never requires more than 32 bits,
// including a sign bit.
//
// If the initial seed is 12345, then the first three computations are
//
// Input Output R4_UNIFORM_01
// SEED SEED
//
// 12345 207482415 0.096616
// 207482415 1790989824 0.833995
// 1790989824 2035175616 0.947702
//
// Licensing:
//
// This code is distributed under the GNU LGPL license.
//
// Modified:
//
// 16 November 2004
//
// Author:
//
// John Burkardt
//
// Reference:
//
// Paul Bratley, Bennett Fox, Linus Schrage,
// A Guide to Simulation,
// Springer Verlag, pages 201-202, 1983.
//
// Pierre L'Ecuyer,
// Random Number Generation,
// in Handbook of Simulation
// edited by Jerry Banks,
// Wiley Interscience, page 95, 1998.
//
// Bennett Fox,
// Algorithm 647:
// Implementation and Relative Efficiency of Quasirandom
// Sequence Generators,
// ACM Transactions on Mathematical Software,
// Volume 12, Number 4, pages 362-376, 1986.
//
// Peter Lewis, Allen Goodman, James Miller,
// A Pseudo-Random Number Generator for the System/360,
// IBM Systems Journal,
// Volume 8, pages 136-143, 1969.
//
// Parameters:
//
// Input/output, int *SEED, the "seed" value. Normally, this
// value should not be 0. On output, SEED has been updated.
//
// Output, float R4_UNIFORM_01, a new pseudorandom variate, strictly between
// 0 and 1.
//
{
int k;
float r;
if ( *seed == 0 )
{
cerr << "\n";
cerr << "R4_UNIFORM_01 - Fatal error!\n";
cerr << " Input value of SEED = 0.\n";
exit ( 1 );
}
k = *seed / 127773;
*seed = 16807 * ( *seed - k * 127773 ) - k * 2836;
if ( *seed < 0 )
{
*seed = *seed + 2147483647;
}
//
// Although SEED can be represented exactly as a 32 bit integer,
// it generally cannot be represented exactly as a 32 bit real number!
//
r = float(double( *seed ) * 4.656612875E-10) ;
return r;
}
//****************************************************************************80
double Sobol::r8_uniform_01 ( int *seed )
//****************************************************************************80
//
// Purpose:
//
// R8_UNIFORM_01 returns a unit pseudorandom R8.
//
// Discussion:
//
// This routine implements the recursion
//
// seed = 16807 * seed mod ( 2**31 - 1 )
// r8_uniform_01 = seed / ( 2**31 - 1 )
//
// The integer arithmetic never requires more than 32 bits,
// including a sign bit.
//
// If the initial seed is 12345, then the first three computations are
//
// Input Output R8_UNIFORM_01
// SEED SEED
//
// 12345 207482415 0.096616
// 207482415 1790989824 0.833995
// 1790989824 2035175616 0.947702
//
// Licensing:
//
// This code is distributed under the GNU LGPL license.
//
// Modified:
//
// 11 August 2004
//
// Author:
//
// John Burkardt
//
// Reference:
//
// Paul Bratley, Bennett Fox, Linus Schrage,
// A Guide to Simulation,
// Springer Verlag, pages 201-202, 1983.
//
// Pierre L'Ecuyer,
// Random Number Generation,
// in Handbook of Simulation
// edited by Jerry Banks,
// Wiley Interscience, page 95, 1998.
//
// Bennett Fox,
// Algorithm 647:
// Implementation and Relative Efficiency of Quasirandom
// Sequence Generators,
// ACM Transactions on Mathematical Software,
// Volume 12, Number 4, pages 362-376, 1986.
//
// Peter Lewis, Allen Goodman, James Miller,
// A Pseudo-Random Number Generator for the System/360,
// IBM Systems Journal,
// Volume 8, pages 136-143, 1969.
//
// Parameters:
//
// Input/output, int *SEED, the "seed" value. Normally, this
// value should not be 0. On output, SEED has been updated.
//
// Output, double R8_UNIFORM_01, a new pseudorandom variate,
// strictly between 0 and 1.
//
{
int k;
double r;
if ( *seed == 0 )
{
cerr << "\n";
cerr << "R8_UNIFORM_01 - Fatal error!\n";
cerr << " Input value of SEED = 0.\n";
exit ( 1 );
}
k = *seed / 127773;
*seed = 16807 * ( *seed - k * 127773 ) - k * 2836;
if ( *seed < 0 )
{
*seed = *seed + 2147483647;
}
//
// Although SEED can be represented exactly as a 32 bit integer,
// it generally cannot be represented exactly as a 32 bit real number!
//
r = ( double ) ( *seed ) * 4.656612875E-10;
return r;
}
//****************************************************************************80
void Sobol::r8mat_write ( string output_filename, int m, int n, double table[] )
//****************************************************************************80
//
// Purpose:
//
// R8MAT_WRITE writes an R8MAT file.
//
// Discussion:
//
// An R8MAT is an array of R8's.
//
// Licensing:
//
// This code is distributed under the GNU LGPL license.
//
// Modified:
//
// 29 June 2009
//
// Author:
//
// John Burkardt
//
// Parameters:
//
// Input, string OUTPUT_FILENAME, the output filename.
//
// Input, int M, the spatial dimension.
//
// Input, int N, the number of points.
//
// Input, double TABLE[M*N], the table data.
//
{
int i;
int j;
ofstream output;
//
// Open the file.
//
output.open ( output_filename.c_str ( ) );
if ( !output )
{
cerr << "\n";
cerr << "R8MAT_WRITE - Fatal error!\n";
cerr << " Could not open the output file.\n";
return;
}
//
// Write the data.
//
for ( j = 0; j < n; j++ )
{
for ( i = 0; i < m; i++ )
{
output << " " << setw(24) << setprecision(16) << table[i+j*m];
}
output << "\n";
}
//
// Close the file.
//
output.close ( );
return;
}
//****************************************************************************80
int Sobol::tau_sobol ( int dim_num )
//****************************************************************************80
//
// Purpose:
//
// TAU_SOBOL defines favorable starting seeds for Sobol sequences.
//
// Discussion:
//
// For spatial dimensions 1 through 13, this routine returns
// a "favorable" value TAU by which an appropriate starting point
// in the Sobol sequence can be determined.
//
// These starting points have the form N = 2**K, where
// for integration problems, it is desirable that
// TAU + DIM_NUM - 1 <= K
// while for optimization problems, it is desirable that
// TAU < K.
//
// Licensing:
//
// This code is distributed under the GNU LGPL license.
//
// Modified:
//
// 12 December 2009
//
// Author:
//
// Original FORTRAN77 version by Bennett Fox.
// C++ version by John Burkardt.
//
// Reference:
//
// IA Antonov, VM Saleev,
// USSR Computational Mathematics and Mathematical Physics,
// Volume 19, 1980, pages 252 - 256.
//
// Paul Bratley, Bennett Fox,
// Algorithm 659:
// Implementing Sobol's Quasirandom Sequence Generator,
// ACM Transactions on Mathematical Software,
// Volume 14, Number 1, pages 88-100, 1988.
//
// Bennett Fox,
// Algorithm 647:
// Implementation and Relative Efficiency of Quasirandom
// Sequence Generators,
// ACM Transactions on Mathematical Software,
// Volume 12, Number 4, pages 362-376, 1986.
//
// Stephen Joe, Frances Kuo
// Remark on Algorithm 659:
// Implementing Sobol's Quasirandom Sequence Generator,
// ACM Transactions on Mathematical Software,
// Volume 29, Number 1, pages 49-57, March 2003.
//
// Ilya Sobol,
// USSR Computational Mathematics and Mathematical Physics,
// Volume 16, pages 236-242, 1977.
//
// Ilya Sobol, YL Levitan,
// The Production of Points Uniformly Distributed in a Multidimensional
// Cube (in Russian),
// Preprint IPM Akad. Nauk SSSR,
// Number 40, Moscow 1976.
//
// Parameters:
//
// Input, int DIM_NUM, the spatial dimension. Only values
// of 1 through 13 will result in useful responses.
//
// Output, int TAU_SOBOL, the value TAU.
//
{
# define DIM_MAX 13
int tau;
int tau_table[DIM_MAX] = {
0, 0, 1, 3, 5,
8, 11, 15, 19, 23,
27, 31, 35 };
if ( 1 <= dim_num && dim_num <= DIM_MAX )
{
tau = tau_table[dim_num-1];
}
else
{
tau = - 1;
}
return tau;
# undef DIM_MAX
}
//****************************************************************************80
void Sobol::timestamp ( )
//****************************************************************************80
//
// Purpose:
//
// TIMESTAMP prints the current YMDHMS date as a time stamp.
//
// Example:
//
// May 31 2001 09:45:54 AM
//
// Licensing:
//
// This code is distributed under the GNU LGPL license.
//
// Modified:
//
// 04 October 2003
//
// Author:
//
// John Burkardt
//
// Parameters:
//
// None
//
{
# define TIME_SIZE 40
static char time_buffer[TIME_SIZE];
const struct tm *tm;
size_t len;
time_t now;
now = time ( NULL );
tm = localtime ( &now );
len = strftime ( time_buffer, TIME_SIZE, "%d %B %Y %I:%M:%S %p", tm );
cout << time_buffer << "\n";
return;
# undef TIME_SIZE
}