/*********************/
//Hard work beats talent when talent doesn’t work hard
// 1% talent but 99% belive and hard work
/*********************/
#include <iostream>
using namespace std;
#include<bits/stdc++.h>
#define int long long
#define ll long long
#define wh while (t--)
#define popcount __builtin_popcountll
#define beg begin()
#define pb push_back
#define endi end()
#define f first
#define sec second
#define endl '\n'
#define mem(arr) memset(arr,0,sizeof arr)
#define iso ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//freopen ("text_file.txt", "w", stdout);
ll gcd(ll x, ll y) {
return (y == 0 ? x : gcd(y, x % y));
}
ll lcm(ll x, ll y) {
return (x / gcd(x, y)) * y;
}
const int MOD =998244353 ;
int n ;
int binary_se(int num)
{
int l =1 ;
int r =num ;
int maxi =1e9 ;
while(l<=r)
{
int mid =(l+r)>>1ll ;
//cout<<mid<<endl ;
if((num*num-mid*mid)<=n&&num!=mid)
{
//cout<<mid<<" "<<num<<" "<<n<<endl ;
maxi =min(maxi,mid) ;
r=mid-1 ;
}
else
l =mid+1 ;
}
if(maxi==1e9)
{
return -1 ;
}
return maxi ;
}
int32_t main() {
//freopen("text_file.txt", "w", stdout);
iso;
cin>> n ;
int ans =0 ;
for(int i=1 ;i*i<=1e12;i++)
{
int x =binary_se(i) ;
//
if(x==-1)
{
continue;
}
cout<<i<<" "<<x<<endl ;
ans=(ans%MOD+(i-x)%MOD)%MOD ;
}
for(int i=1 ;i*i<=n ;i++)
{
ans++ ;
ans%=MOD ;
}
cout<<ans<<endl ;
}
LyoqKioqKioqKioqKioqKioqKioqKi8KLy9IYXJkIHdvcmsgYmVhdHMgdGFsZW50IHdoZW4gdGFsZW50IGRvZXNu4oCZdCB3b3JrIGhhcmQKLy8gMSUgdGFsZW50IGJ1dCA5OSUgYmVsaXZlIGFuZCBoYXJkIHdvcmsKLyoqKioqKioqKioqKioqKioqKioqKi8KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CgojZGVmaW5lIGludCBsb25nIGxvbmcKI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSB3aCB3aGlsZSAodC0tKQojZGVmaW5lICBwb3Bjb3VudCBfX2J1aWx0aW5fcG9wY291bnRsbAojZGVmaW5lIGJlZyBiZWdpbigpCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgZW5kaSBlbmQoKQojZGVmaW5lIGYgZmlyc3QKI2RlZmluZSBzZWMgc2Vjb25kCiNkZWZpbmUgZW5kbCAnXG4nCiNkZWZpbmUgbWVtKGFycikgbWVtc2V0KGFyciwwLHNpemVvZiBhcnIpCiNkZWZpbmUgaXNvIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpO2Npbi50aWUoMCk7Y291dC50aWUoMCk7Ci8vZnJlb3BlbiAoInRleHRfZmlsZS50eHQiLCAidyIsIHN0ZG91dCk7CmxsIGdjZChsbCB4LCBsbCB5KSB7CiAgICByZXR1cm4gKHkgPT0gMCA/IHggOiBnY2QoeSwgeCAlIHkpKTsKfQoKbGwgbGNtKGxsIHgsIGxsIHkpIHsKICAgIHJldHVybiAoeCAvIGdjZCh4LCB5KSkgKiB5Owp9CmNvbnN0IGludCBNT0QgPTk5ODI0NDM1MyA7CmludCBuIDsKaW50IGJpbmFyeV9zZShpbnQgbnVtKQp7CiAgICBpbnQgbCA9MSA7CiAgICBpbnQgciA9bnVtIDsKICAgIGludCBtYXhpID0xZTkgOwogICAgd2hpbGUobDw9cikKICAgIHsKICAgICAgICBpbnQgbWlkID0obCtyKT4+MWxsIDsKICAgICAgICAvL2NvdXQ8PG1pZDw8ZW5kbCA7CiAgICAgICAgaWYoKG51bSpudW0tbWlkKm1pZCk8PW4mJm51bSE9bWlkKQogICAgICAgIHsKICAgICAgICAgICAvL2NvdXQ8PG1pZDw8IiAiPDxudW08PCIgIjw8bjw8ZW5kbCA7CiAgICAgICAgICAgIG1heGkgPW1pbihtYXhpLG1pZCkgOwogICAgICAgICAgICByPW1pZC0xIDsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICBsID1taWQrMSA7CiAgICB9CiAgICBpZihtYXhpPT0xZTkpCiAgICB7CiAgICAgICAgcmV0dXJuIC0xIDsKICAgIH0KICAgIHJldHVybiBtYXhpIDsKfQppbnQzMl90IG1haW4oKSB7CiAgICAvL2ZyZW9wZW4oInRleHRfZmlsZS50eHQiLCAidyIsIHN0ZG91dCk7CiAgICBpc287CiBjaW4+PiBuIDsKIGludCBhbnMgPTAgOwogZm9yKGludCBpPTEgO2kqaTw9MWUxMjtpKyspCiB7CiAgICAgaW50IHggPWJpbmFyeV9zZShpKSA7CiAgIC8vCiAgIGlmKHg9PS0xKQogICB7CiAgICAgICBjb250aW51ZTsKICAgfQogICBjb3V0PDxpPDwiICI8PHg8PGVuZGwgOwogICAgIGFucz0oYW5zJU1PRCsoaS14KSVNT0QpJU1PRCA7CiB9CiBmb3IoaW50IGk9MSA7aSppPD1uIDtpKyspCiB7CiAgICAgYW5zKysgOwogICAgIGFucyU9TU9EIDsKIH0KIGNvdXQ8PGFuczw8ZW5kbCA7Cn0=