[数学] Jzoj P3912 超氧化钾
题解
- 首先,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\n",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 }