《基础学习》之 整除划分

整除分块

整除分块,可以把一些算法优化为O(\sqrt{n})级别
我们在计算\sum_{n}^{i=1}\left \lfloor \frac{n}{i} \right \rfloor时,一般的直接枚举都是O(\sqrt{_{n^{2}}})
但是我们通过一些神奇的操作发现,在计算\sum_{n}^{i=1}\left \lfloor \frac{n}{i} \right \rfloor时,有一段的\left \lfloor \frac{n}{i} \right \rfloor的值是相等的,然后我们就可以对于每一段只计算一次,每一次的区间的长度为\frac{n}{\frac{n}{i}},复杂度就降低了.

题目:

题目链接:https://www.nowcoder.com/acm/contest/158/A
 

题目描述

q次询问,每次给一个x,问1到x的因数个数的和。

输入描述:

第一行一个正整数q ;
接下来q行,每行一个正整数 x

输出描述:

共q行,每行一个正整数表示答案

示例1

输入

4
1
2
3
10

输出

1
3
5
27

说明

1的因数有1

2的因数有1,2

3的因数有1,3

以此类推

备注:

1<=q<=10 ,1<= x<=109
/*
思路:整除分块
*/



#include<bits/stdc++.h>

using namespace std;

int main(){
	int n,q;
	scanf("%d",&n);
	while(n--){
		scanf("%d",&q);
		long long ans=0; 
		for(int i=1,j;i<=q;i=j+1)
		{
		    j=q/(q/i);
			ans += (long long)(j-i+1)*(q/i);    
		}
		printf("%lld\n",ans);
	}
} 

猜你喜欢

转载自blog.csdn.net/Rvelamen/article/details/82155679