题目大意
给出正整数$n$和$k$,计算$j(n,k)=k\bmod\,1+k\bmod\,2+k\bmod\,3 +\cdots+k\bmod n$的值,其中$k\bmod i$表示$k$除以$i$的余数。
例如$j(5,3)=3\bmod\,1+3\bmod\,2+3\bmod\,3+3\bmod\,4+3\bmod\,5=0+1+0+3+3=7$
题目分析
题目要求的即为:
因为$\lfloor\frac ki\rfloor$有部分块是相同的,故分块计算,时间复杂度$O(\sqrt{n})$
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #include<algorithm> #include<iostream> #include<iomanip> #include<cstring> #include<cstdlib> #include<vector> #include<cstdio> #include<cmath> #include<queue> using namespace std; typedef long long LL; inline const LL Get_Int() { LL num=0,bj=1; char x=getchar(); while(x<'0'||x>'9') { if(x=='-')bj=-1; x=getchar(); } while(x>='0'&&x<='9') { num=num*10+x-'0'; x=getchar(); } return num*bj; } LL n,k,ans=0; int main() { n=Get_Int(); k=Get_Int(); LL next; for(int i=1; i<=min(n,k-1); i=next+1) { next=min(k/(k/i),min(n,k-1)); ans+=k*(next-i+1)-(k/i)*(i+next)*(next-i+1)/2; } if(n>k)ans+=(n-k)*k; printf("%lld\n",ans); return 0; }
|