原题题址
题目描述
四舍五入下成功率,大概就是百分之百的样子。
——韩信-逐梦之影
小T喜欢玩数。这天他弄到了一个数n,他玩心大发,他让小s求它的正因数数量。
小s并不会这道题,现在如果你是他,你会怎么做?
小T为了防止小s作弊,他要询问T次。
输入描述:
第一行一个整数T。
后T行每行一个整数n。
输出描述:
T行一个整数代表答案。
示例1
输入1 6
输出
4
说明
6的因数有1 2 3 6共4个
100% 1≤n,T≤104
显然最直接想到最小约数定理,先筛素数一下,再通过分解N,
N
=
p
1
a
1
+
p
2
a
2
+
.
.
.
+
p
n
a
n
N = p_{1}^{a_{1}}+p_{2}^{a_{2}}+...+p_{n}^{a_n}
N=p1a1+p2a2+...+pnan
那么
∏
i
=
1
n
(
a
i
+
1
)
\prod_{i=1}^{n}(a_{i}+1)
∏i=1n(ai+1)即为约数个数。
代码:
#include"iostream"
using namespace std;
int a[10000],cnt = 0;
bool p[10000+5];
int main(){
for(int i = 2;i <= 10000;i++){//素数筛
if(!p[i]){
a[cnt++]=i;
for(int j = i;j <= 10000;j+=i)p[j]=1;
}
}
int T;
cin >> T;
while(T--){
int i = 0,p,ans = 1;
cin >> p;
while(p>1){
int Num = 0;
while(p%a[i]==0&&i<cnt)p/=a[i],Num++;
i++;
ans*=(Num+1);
}
cout << ans <<endl;
}
}
素数筛其实可以直接做,不判重地筛,筛到一次就意味着有一个因数,记录刷到的次数即可。
memset(ans,0,sizeof(ans));
for(int i = 1;i <= N;i++){//ans即为因数数组。
for(int j = 1;j*i <= N;j++)
ans[j*i]++;
}