牛客练习赛25 因数个数和

13 篇文章 0 订阅

https://blog.csdn.net/u011787439/article/details/82183783 大佬的博客写的很清楚  求1-n的因子个数和 就是从1-n中qu的数任意取一个数i 在1-n之间有多少是i的倍数 即[n/i]   因为n/i的结果也是 n的因数 所以可以只算 1-sqrt(n)  然后乘 2 , 因为n/i可以等于i,乘2重复计算了,还要减去这些重复计算的数  只要 i的平方小于等于n 都算重复计算的  一共重复计算了sqrt(i)*sqrt(i)个 

 sqrt(n)个因子每个多算了sqrt(n)次 因为是直接用n/i

#include<bits/stdc++.h>
using namespace std;
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        long long int ans=0;
        long long int x=0;
        scanf("%lld",&x);
        //cout<<x<<endl;
        long long int sq=sqrt(x);
        for(long long  i=1;i<=sq;i++){
            ans+=x/i;
        }
        printf("%lld\n",2*ans-sq*sq);
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值