题意:
给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的余数。
例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3 mod 5=0+1+0+3+3=7.
50%的数据满足:1<=n, k<=1000 100%的数据满足:1<=n ,k<=10^9
思路:
这个题目,数据范围这么大,肯定有巧妙的方法。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int maxn=1e5+10;
ll n,k;
int main(){
scanf("%lld%lld",&n,&k);
ll ans=n*k;
n=min(n,k);
ll r,cnt,w;
for(int i=1;i<=n;i=r+1)
{
w=k/i;
r=k/w;
if(r>n)
r=n;
cnt=r-i+1;
ans-=w*cnt*(i+r)/2;
}
printf("%lld\n",ans);
return 0;
}