#include <iostream>
#include <vector>
#include <chrono>
#include <math.h>
#include <fstream>
#include <algorithm>
using namespace std;
bool diffTest(int numElements)
{
std::vector<int> ele(numElements);
for (int i = 0; i < numElements; ++i)
ele[i] = i * i;
std::vector<std::vector<int>> diff(numElements);
for (int i = 0; i < numElements; ++i)
{
diff[i].resize(numElements);
for (int j = 0; j < numElements; ++j)
diff[i][j] = ele[i] - ele[j];
}
return true;
}
bool myfunction (vector<int> i,vector<int> j) {
if (i[1] < j[1])
return true;
else
if (i[1] == j[1])
return (i[0] < j[0]);
return false;
}
void solvePuzzle(int largestNumber, int seqLength, vector<vector<int>>& ansList)
{
// generate bi-squares
int numBisquares = (largestNumber + 2) * (largestNumber + 1) / 2;
int maxBisquare = largestNumber * largestNumber * 2;
vector<bool> LUT(maxBisquare + 1, false);
int cnt = 0;
for (int i = 0; i <= largestNumber; i++)
{
for (int j = i; j <= largestNumber; j++)
{
int bisquare = i * i + j * j;
//bisquares[cnt] = bisquare;
LUT[bisquare] = true;
cnt++;
}
}
//sort(bisquares.begin(),bisquares.end());
// iterate bi-squares
for (int i = 0; i < LUT.size(); i++)
{
if (LUT[i] == true)
{
int bis = i;
int maxDiff = ceil((maxBisquare - bis) / (seqLength - 1));
for (int diff = 1; diff <= maxDiff; diff++)
{
bool seqFound = true;
for (int j = 1; j < seqLength; j++)
{
if (!LUT[bis + j * diff])
{
seqFound = false;
break;
}
}
if (seqFound)
{
vector<int> ans(2);
ans[0] = bis; ans[1] = diff;
ansList.push_back(ans);
}
}
}
}
sort(ansList.begin(),ansList.end(),myfunction);
}
int main()
{
ifstream fIn ("ariprog.in");
int largestNumber, seqLength;
fIn >> seqLength >> largestNumber;
fIn.close();
vector<vector<int>> ansList;
solvePuzzle(largestNumber, seqLength, ansList);
ofstream fOut ("ariprog.out");
if (ansList.size() == 0){
fOut << "NONE" << std::endl;
}
else{
for (auto ans: ansList)
{
fOut << ans[0] << " " << ans[1] << std::endl;
}
}
fOut.close();
return 0;
}