题目
q次询问,每次给一个x,问1到x的因数个数的和。
输入描述:
第一行一个正整数q ;接下来q行,每行一个正整数 x
输出描述:
共q行,每行一个正整数表示答案
输入
4
1
2
3
10
输出
1
3
5
27
备注:
1<=q<=10 ,1<= x<=1e9
分析
方法1:欧拉筛枚举
绝逼炸了,无论是空间还是时间
方法2:枚举因数
例如对于6,ans=6/1+6/2+6/3+6/4+6/5+6/6,方法是O(n)的,会t
方法3
对数进行分块处理,即对方法2看进行改良,举个例子,对于6,发现
ans=6/1+6/2+6/3+6/4+6/5+6/6,即ans=6+3+2+1+1+1。
所以可根据运算结果进行分块处理,从而整理,以此优化算法
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
long long ans,m,x;
int main(){
scanf("%lld",&m);
while(m--){
scanf("%lld",&x);
ans=0;
for(int i=1,j;i<=x;i=j+1){
j=x/(x/i);
ans+=(x/i)*(j-i+1);
}
printf("%lld\n",ans);
}
return 0;
}