题解:P15395 幻影之春 / phantom

本蒟蒻的第一篇题解,大佬勿喷。

题目传送门

解题思路

那么……

#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,sum=0;
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		sum+=(int)sqrt(i);
	}
	cout<<sum;
    return 0;
}

然后你就会发现神奇的 TLE 了

再次观察数据范围 \(1 \le n \le 10^{18}\)

我们在样例中寻找规律,就会发现由于是下向下取整,那么可以得知 \(\forall i \in 1, \lfloor \sqrt{n} \rfloor - 1\) ,\(i^2 \sim \min(n, (i + 1) ^ 2 - 1)\) 这 \(i \times (2 \times i + 1)\) 个数字开方后结果都为 \(i\)

所以……

#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,ans;
signed main(){
    cin>>n;
    int k=(int)sqrt(n);
    for(int i=1;i<=k;i++){
        int l=i*i;
        int r=min(n,(i+1)*(i+1)-1);
        int sum=r-l+1;
        ans+=i*sum;
    }
    cout<<ans<<endl;
    return 0;
}

然后,就 WA 了

仔细分析,发现在 \(i \times (2 \times i + 1)\) 中可能会爆 long long, 那么就需要用到 __int128。

AC CODE

include <bits/stdc++.h>

using namespace std;

define int long long

__int128 ans=0;
int n;
void out(__int128 sum){
if(sum>=10){
out(sum/10);
}
putchar(sum%10+'0');
}
signed main(){
cin>>n;
int k=sqrt(n);
for(int i=1;i<=k-1;i++)
ans+=2ii+i;
ans+=k(n-kk+1);
out(ans);
return 0;
}

管理员大大辛苦啦
posted @ 2026-10-30 16:40  zhouguoyi  阅读(2)  评论(0)    收藏  举报