1257: [CQOI2007]余数之和
Time Limit: 5 Sec Memory Limit: 128 MB
题目链接https://www.lydsy.com/JudgeOnline/problem.php?id=1257
Description
给出正整数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
Input
输入仅一行,包含两个整数n, k。
1<=n ,k<=10^9
Output
输出仅一行,即j(n, k)。
Sample Input
5 3
Sample Output
7
大概意思就是让你计算。。。这个和整数分块有什么关系呢?
前面就是n*k,后面就是分块操作了。。。
我们首先需要知道的是对于一个数x,从i到[x/[x/i]]这整块区域的值都是一样的,那么也就是说我们可以直接找区间的端点进行计算就好了:
for (ll l=1,r=0; l<=n; l=r+1){
if (k/l) r=min(k/(k/l),n);//由于k的值可能大于n,所以需要取min
else r=n;
*****
}
以下是AC代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int mac=1e5+10;
int main()
{
ll n,k;
cin>>n>>k;
ll ans=n*k;
for (ll l=1,r=0; l<=n; l=r+1){
if (k/l) r=min(k/(k/l),n);
else r=n;
ans-=(l+r)*(r-l+1)*(k/l)/2;//一段等差数列*一段一样的数
}
cout<<ans<<endl;
return 0;
}

408

被折叠的 条评论
为什么被折叠?



