题目链接:https://vjudge.net/problem/HYSBZ-1257
给出正整数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
1<=n ,k<=10^9
暴力必然TLE。
打表找规律发现,mod值有一段会相同,把答案分成一块一块
#include<bits/stdc++.h> #define rd(x) x=read() #define ll long long using namespace std; ll n,k; inline ll read() { ll f=1,x=0;char s=getchar(); while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();} while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();} return x*f; } int main() { rd(n),rd(k); ll ans=n*k; ll r; for(ll l=1;l<=n;l=r+1) { if(k/l)r=min(k/(k/l),n); else r=n; ans-=(k/l)*(r-l+1)*(l+r)/2; } cout<<ans<<endl; return 0; }