欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[CQOI2007]余数求和(数学)

程序员文章站 2022-04-02 21:27:37
...

Luogu2261

题解:

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

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

然后简单转化:kk modmod i=kki×ii=k-\lfloor \frac{k}{i} \rfloor \times i,用等差数列求和方法就可以O(n)O(\sqrt n)解出此题

代码:

#include <iostream>
#include <stdio.h>
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;
}
相关标签: 数学