P1403 [AHOI2005] 约数研究

今天为大家再次带来一道数论题,我原本挺喜欢约数的种种奇妙性质的,做了这道题后我变的厌烦了好吧! 

话不多说!我们正式开始!(那你还说那么多话) 

 题目中的f(i)实际是\sigma(i)

        则可将\sum_{i=1}^{n}f(i)化为:\sum_{i=1}^{n}\sigma (i)

                                \sum_{i=1}^{n}\sigma (i)=\sum_{i=1}^{n}\sum_{d\mid i}^{}1

                                                   =\sum_{i=1}^{n}\sum_{d=1}^{n}[d\mid i]

                                                    =\sum_{d=1}^{n}\sum_{i=1}^{n}[d\mid i]

                                                    =\sum_{d=1}^{n}\left \lfloor \frac{n}{d} \right \rfloor

至于求和旁边的对n/d向下取整的那玩意,用分块求解好一点。(相信你不想TLE的)

ACCODE

#include<bits/stdc++.h>
long long ans,n;
int main() {
    scanf("%d",&n);
    for (int i=1,j;i<=n;i=j+1) {
       j=std::min(n,n/(n/i));
       ans+=(long long)(j-i+1)*(n/i);
     }
     printf("%lld\n",ans);
}

你不会以为完了吧!

还有方法!

枚举1--n中因子有i的数的个数!重点在与一个数学公式: f(i)=n/i

 

至于公式的含义,看我解释:

1∼n 的因子个数,可以看成含有 2 这个因子的数的个数 + 含有 3 这个因子的数的个数 +....+ 含有n这个因子的数的个数。在 1∼n中含有“2”这个因子的数有n/2。3有n/3个。以此类推,公式就出来了

ACCODE

#include<bits/stdc++.h>
using namespace std;
long long n,ans;
int main(){
	scanf("%d",&n);
	for(long long i=1;i<=n;++i){//枚举1--n中因子有i的数的个数
		ans+=n/i;
	}
	printf("%d",ans);
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值