[CQOI2007]余数求和(数学)

Luogu2261

题解:

本题主要是两个重要结论:

  1. 一个数除以1~n的所有数向下取整的结果最多只有 n \sqrt n n 种(目前本菜鸡还不会证,不过我估计不久我就会证了)
  2. 得到1性质中结果相等的一段可以这样如代码中标记的那行做(证明方法也不太严谨)

然后简单转化: k k k m o d mod mod i = k − ⌊ k i ⌋ × i i=k-\lfloor \frac{k}{i} \rfloor \times i i=kik×i,用等差数列求和方法就可以 O ( n ) O(\sqrt n) O(n )解出此题

代码:

#include 
#include 
using namespace std;
long long n,k,ans,r,nowv;

int main()
{
	cin>>n>>k;
	for(long long l=1;l<=n;l=r+1){
		nowv=k/l; /*标记处*/
		if(!nowv)
			r=n; /*防除0错*/
		else
			r=min(n,k/nowv); /*标记处*/
		long long len=r-l+1,he=(len*(l+r))/2;
		ans+=k*len-nowv*he;
	}
	cout<<ans<<endl;
	return 0;
}

你可能感兴趣的:(数学)