题解: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;
}
管理员大大辛苦啦

浙公网安备 33010602011771号