诡异的因数

原题题址
题目描述

四舍五入下成功率,大概就是百分之百的样子。
——韩信-逐梦之影

小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]++; 
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值