5814: 余数之和(整数分块)
Posted qq-1585047819
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5814: 余数之和(整数分块)相关的知识,希望对你有一定的参考价值。
描述
给出正整数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
输入
输入仅一行,包含两个整数n, k。
1<=n ,k<=10^9
输出
输出仅一行,即j(n, k)。
样例输入
样例输出
解题思路: 整数分块最后那个数为j=k/(k/i) f(n,k)=Σ(k-i*k/i) (i=1~n); 等差求和
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 ll n,k; 5 ll cal() 6 ll j,res=0; 7 for(int i=1;i<=min(n,k);i=j+1) 8 j=min(n,k/(k/i)); 9 res+=(i+j)*(k/i)*(j-i+1)/2; 10 11 return res; 12 13 int main() 14 ios::sync_with_stdio(false); 15 cin>>n>>k; 16 cout << n*k-cal() << endl; 17 return 0; 18
以上是关于5814: 余数之和(整数分块)的主要内容,如果未能解决你的问题,请参考以下文章
bzoj 1257 : [CQOI2007]余数之和 (数学+分块)
bzoj 1257 [CQOI2007]余数之和——数论分块