专栏文章
题解:AT_abc428_d [ABC428D] 183184
AT_abc428_d题解参与者 8已保存评论 9
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @minki3iy
- 此快照首次捕获于
- 2025/12/02 03:54 3 个月前
- 此快照最后确认于
- 2025/12/02 03:54 3 个月前
在下文中,定义 为 的十进制位数,且 表示题中 。
首先 这个形式很难计数,所以考虑把它写成 。( 为 )
接下来考虑枚举 (因为 可能大于 ),根据题意易得 。
而因为 是一个 位数,能得出 且 。所以得 。我们得出第一个 的范围。
接着整合题目中条件。需要 为平方数,即 且 。移项一下 即得 ,再根据上文的条件并让上下界各加上 可以得到求的是 。方便起见,将上界设为 ,下界设为 。则可以通过差分思想得 。
首先 这个形式很难计数,所以考虑把它写成 。( 为 )
接下来考虑枚举 (因为 可能大于 ),根据题意易得 。
而因为 是一个 位数,能得出 且 。所以得 。我们得出第一个 的范围。
接着整合题目中条件。需要 为平方数,即 且 。移项一下 即得 ,再根据上文的条件并让上下界各加上 可以得到求的是 。方便起见,将上界设为 ,下界设为 。则可以通过差分思想得 。
代码:
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
int T,d,c;
signed main(){
cin>>T;
while(T--){
cin>>c>>d;
int ans=0;
int LL=log10(c+1)+1,RR=log10(c+d)+1;
for(int i=LL;i<=RR;i++){
__int128 mul=1;
for(int j=1;j<=i;j++) mul*=10;
__int128 lx=max(1ll,(int)(mul/10)-c),rx=min(d,(int)(mul-1-c));
if(lx>rx) continue;
__int128 l=c*mul+c+lx,r=c*mul+c+rx,x1=sqrtl(l-1),x2=sqrtl(r);
ans+=x2-x1;
}
cout<<ans<<"\n";
}
}
如果有公式打错,请私信我。否则求一个赞喵
相关推荐
评论
共 9 条评论,欢迎与作者交流。
正在加载评论...