题解
- 首先,40%的数据,直接暴力做就好了
- 100%,找规律
- 对于y>x的数,显然在y-x后面这一段都是x,这个应该没问题
- 然后我们就可以找到这个规律 [x/p+1~x/(p-1)]是一个公差为p-1的等差数列
- 然后就没有然后了
代码
1 #include <cstdio>
2 #include <iostream>
3 #include <cstring>
4 #define ll long long
5 using namespace std;
6 ll x,y,ans,l,r,k,inf=1e5;
7 int main()
8 {
9 scanf("%lld%lld",&x,&y);
10 if (y<=inf)
11 {
12 for (ll i=1;i<=y;i++) ans+=x%i;
13 printf("%lld
",ans); return 0;
14 }
15 for (int i=2;i;i++)
16 {
17 if (x/(i-1)<inf) { k=min(x/(i-1),y); break; }
18 l=x/i+1,r=min(x/(i-1),y),ans+=(x%l+x%r)*(r-l+1)/2;
19 }
20 for (ll i=2;i<=k;i++) ans+=x%i;
21 if (x<y) ans+=(y-x)*x;
22 printf("%lld",ans);
23 }