题目背景
数学题,无背景
题目描述
给出正整数 nn 和 kk 计算 G(n, k)=k\ \bmod\ 1 + k\ \bmod\ 2 + k\ \bmod\ 3 + \cdots + k\ \bmod\ nG(n,k)=k mod 1+k mod 2+k mod 3+⋯+k mod n 的值 其中 k\ \bmod\ ik mod i 表示 kk 除以 ii 的余数。
例如 G(10, 5)=5\ \bmod\ 1 + 5\ \bmod\ 2 + 5\ \bmod\ 3 + 5\ \bmod\ 4 + 5\ \bmod\ 5 \cdots + 5\ \bmod\ 10G(10,5)=5 mod 1+5 mod 2+5 mod 3+5 mod 4+5 mod 5⋯+5 mod 10 \qquad\quad\ \ \ =0+1+2+1+0+5+5+5+5+5=29 =0+1+2+1+0+5+5+5+5+5=29
输入输出格式
输入格式:
两个整数 nn ,kk
输出格式:
答案
输入输出样例
输入样例#1: 复制
10 5
输出样例#1: 复制
29
说明
30\%: n , k \le 100030%:n,k≤1000
60\%: n , k \le 10^660%:n,k≤106
100\%: n , k \le 10^9100%:n,k≤109
是个好题,记录一下。
k%i == k −i ×⌊ i / k⌋
ans=∑ k% i 转换为 ans=n*k −∑ i× ⌊i/k⌋
对⌊ i/k⌋ 打标,分块
可以得到规律
1 2 3 4 5 6 7 8 9 10
5 2 1 1 1 0 0 0 0 0
相同的数字分为一块,分为5 , 2, 1 1 1,0 0 0 0 0四块
可以根据k,求出每一块的和,
令t等于每一块的的元素值,t=⌊ i/k ⌋
k/t就是块的右边界,再根据右边界得到下一块的左边界
wo~,真是个神奇的东西
#include<bits/stdc++.h>
using namespace std;
using lom=long long;
int main()
{
lom n,k,ans;
cin>>n>>k;
ans=n*k;
for(lom l=1,r;l<=n;l=r+1)
{
lom t=k/l;
if(t==0) r=n;
else r=min(k/t,n);
ans-=t*(r-l+1)*(l+r)/2;
}
cout<<ans;
}