题目描述
给出正整数n和k,计算
k
解题思路
先把k mod n看成
显然对于n/k相同的n形成了一个区间,区间的范围就是 n/(n/k+1)+1 ~ n/(n/k)
区间的个数显然不超过 n√ 个。
然后乱搞就可以了。
#include<cstdio>
#include<cmath>
#define LL long long
using namespace std;
LL n,m,pd,ans;
void work(LL L,LL R,int k){
if (L>m) return;
if (R>m) R=m;
ans+=n*(R-L+1)-(L+R)*(R-L+1)/2*k;
}
int main(){
freopen("exam.in","r",stdin);
freopen("exam.out","w",stdout);
scanf("%lld%lld",&m,&n);pd=sqrt(n);
for (int i=1;i<=pd;i++) work(n/(i+1)+1,n/i,i);
for (int i=1;i<=n/(pd+1);i++) if (i<=m) ans+=n%i;
if (m>n) ans+=n*(m-n);
printf("%lld\n",ans);
return 0;
}