感觉思路没错但就是过不了样例
查看原帖
感觉思路没错但就是过不了样例
300078
pengyule楼主2020/7/17 22:16
#include <bits/stdc++.h>
using namespace std;
int H(int n){
    int ans=0;
    for(int i=1;i<=n;i=n/(n/i)+1){
        int l=i,r=n/(n/i);
        int len=r-l+1;
        ans+=(n%l+n%r)*len/2;
    }
    return ans;
}
int main()
{
    int n,k;
    cin>>n>>k;
    int sum=H(min(k,n));
    for(int i=min(k,n)+1;i<=max(k,n);i++) sum+=i;
    cout<<sum<<endl;
    return 0;
}

请大家指点指点,思路就是,既然整除分块,那么就把所有块中的数的余数加起来,是个等差数列,所以就对n%l(l:块左端点)为首项,n%r(r:块右端点)为末项,公差为1的等差数列求和加进ans

2020/7/17 22:16
加载中...