链接

题意:

给出你一个N,然后让你在[1,N]范围内找出两个数(x,y)使得这两个数满足以下条件

  • ARC 125 B - Squares (思维+数学推导)_i++

分析:

首先我们看:ARC 125 B - Squares (思维+数学推导)_ARC_02那么ARC 125 B - Squares (思维+数学推导)_ARC_03同时平方得:ARC 125 B - Squares (思维+数学推导)_#define_04
ARC 125 B - Squares (思维+数学推导)_i++_05
ARC 125 B - Squares (思维+数学推导)_#define_06
推到这个地方我们就会发现没法再往下,那么我们看左边是一个差,一个和。那么我们不妨先枚举一下差好了,

  • 0的话我们最后再说。
  • 差是1的话那么注定两个数是相邻的,
  • ARC 125 B - Squares (思维+数学推导)_ARC_07

  • 就是这样子的,这样最小的y就是3(可看成1+2),之后就+2,+2,+2(为什么都是+2一会就说不要着急)
    加上n是10的话那么一共的对数不就是ARC 125 B - Squares (思维+数学推导)_i++_08,类比到n就是ARC 125 B - Squares (思维+数学推导)_#include_09
  • 然后我们看看一个差为a,
  • ARC 125 B - Squares (思维+数学推导)_#define_10

  • 可以看到y最小为1+a,之后就是+2,+2,+2,在这里解释为什么都是+2,因为两端长度我们固定,左端+1之后,右端也一定会+1,所以就相当于构成了等差数列的那种,当然我们还要把初始的差减去,所以当差为a时满足条件的对数为ARC 125 B - Squares (思维+数学推导)_#define_11
  • 接下来我们看另一边边界,当我们计算差值x大于等于ARC 125 B - Squares (思维+数学推导)_ARC_12说明我们已经不能再算了,因为ARC 125 B - Squares (思维+数学推导)_#include_13,z是大于等于0的这个之前说了,所以当出现这样的时候就是我们退出的时候,
  • 我说停停,还有差为0的没有分析:差为0说明ARC 125 B - Squares (思维+数学推导)_ARC_14那么就是我们提取[1,n]中的平方数即可。也可以借用上个状态来求。
// Problem: B - Squares
// Contest: AtCoder - AtCoder Regular Contest 125
// URL: https://atcoder.jp/contests/arc125/tasks/arc125_b
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef unsigned long long ull;

#define x first
#define y second
#define sf scanf
#define pf printf
#define PI acos(-1)
#define inf 0x3f3f3f3f
#define lowbit(x) ((-x)&x)
#define mem(a,x) memset(a,x,sizeof(a))
#define rep(i,n) for(int i=0;i<(n);++i)
#define repi(i,a,b) for(int i=int(a);i<=(b);++i)
#define repr(i,b,a) for(int i=int(b);i>=(a);--i)
#define debug(x) cout << #x <<": " << x << endl;

const int MOD = 998244353;
const int mod = 998244353;
const int maxn = 2e5 + 10;
const int dx[] = {0, 1, -1, 0, 0};
const int dy[] = {0, 0, 0, 1, -1};
const int dz[] = {1, -1, 0, 0, 0, 0 };
int day[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

void init(){

}
ll n;

void solve()
{
ll ans=0;
cin>>n;
for(ll i=1;;i++){
ll j=n/i;
if(j==i){
ans+=j;
ans=ans%mod;
break;
}
if(j<i){
ans+=(i-1);
ans=ans%mod;
break;
}
ans+=(j-i)/2;
ans=ans%mod;
}
cout<<ans<<endl;
}

int main()
{
init();
ll t = 1;
//scanf("%lld",&t);
while(t--)
{
solve();
}
return 0;
}