整除分块
整除分块,可以把一些算法优化为级别
我们在计算时,一般的直接枚举都是
但是我们通过一些神奇的操作发现,在计算时,有一段的的值是相等的,然后我们就可以对于每一段只计算一次,每一次的区间的长度为,复杂度就降低了.
题目:
题目链接: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);
}
}