牛客练习赛25
链接:https://www.nowcoder.com/acm/contest/158/A
来源:牛客网
q次询问,每次给一个x,问1到x的因数个数的和。
输入描述:
第一行一个正整数q ;
接下来q行,每行一个正整数 x
输出描述:
共q行,每行一个正整数表示答案
备注:
1<=q<=10 ,1<= x<=10^9
1 #include <iostream>
2 #include <cstdio> 3 #include <algorithm> 4 #include <cstdlib> 5 #include <cstring> 6 #include <string> 7 #include <deque> 8 #include <vector> 9 #include <set> 10 #include <map> 11 #include <cmath> 12 using namespace std; 13 #define ll long long 14 int t,n; 15 ll solve(int n)//1~n中所有因子的个数和 16 { 17 ll ans=0;
18 for(int i=1,last;i<=n;i=last+1){//sqrt(N)的复杂度,i==last+1 19 last=n/(n/i);//分块 : last : 出现n/i次的最大因子 5/3 5/4 5/5 3 4 5 都出现了一次 20 ans+=(ll)(n/i)*(last-i+1);//n/i :i作为因子共出现的次数 21 } 22 return ans; 23 } 24 int main() 25 { 26 scanf("%d",&t); 27 while(t--) 28 { 29 scanf("%d",&n); 30 printf("%lld\n",solve(n)); 31 } 32 return 0; 33 }