前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >做题总结——Fear Factoring

做题总结——Fear Factoring

作者头像
用户8224910
发布2021-01-26 15:33:05
4310
发布2021-01-26 15:33:05
举报
文章被收录于专栏:个人学习总结

做题总结——Fear Factoring

原题

在这里插入图片描述
在这里插入图片描述

题意分析:

这道题目题意很简单,就是求出[a,b]区间内所有数的因数之和

做题思路:

开始自己的做法是特别愚蠢的 暴力破解法,也就是分别枚举[a,b]区间里每一个数的因数,最后累加起来,可想而知这种做法肯定是不对的。后面听了学长的讲解,这道题一共有两种思路。

  • 枚举从1到sqrt(b)的每一个数i,求出[a,b]能够以i作为因数的最小的那个数,这样就可以得到[a,b]区间内所有可以以i为因数的数,再进行累加即可
  • 利用数论分块的方法,具体分析参考数论分块解决

代码实现

1、暴力破解法:

代码语言:javascript
复制
//利用暴力破解法
#include <bits/stdc++.h>
using namespace std;
int main()
{
    long long a, b, i;
    while (cin >> a >> b)
    {
        long long ans=0;
        for (i = 1; i * i <= b; i++)
        {
            long long d = (a / i) * i;    //求出[a,b]内第最小的能够以i作为因数的数
            while (d < a  || i*i>d)      //如果求出的d小于a或者原来已经求过因数了,取下一个能够以i为因数的(也就是d+i)
            {
            	d+=i;
            }
            for (d; d <= b; d += i)      //累加因数
            {
                ans += i;               
                if (i < d / i)          //这里的判断防止累加重复了
                {
                    ans += d / i;
                }
            }
        }
        cout << ans << endl;
    }
    //system("pause");
    return 0;
}

2、数论分块法

代码语言:javascript
复制
//利用数论分块的思想解决该问题
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;    //这里不用unsigned long long无法AC
ll sol(ll n)
{
    ll ans=0;
    ll r;
    for(ll l=1;l<=n;l=r+1)  //枚举因数,同时更新区间的右端点
    {
        ll s=n/l;  //s是从1到n中含因数l的数的个数
        r=n/s;   //[l,r]中的每一个数能作为从1到n中s个数的因数(相当于求分块区间的右端点)(这里描述不太准确,以后想明白再修改)
        ans+=(l+r)*(r-l+1)/2*s;     //[l,r]作为因数的贡献,相当于求一个等比数列的值
    }   
    return ans;
}
int main()
{
    ll a,b;
    while((scanf("%llu%llu", &a, &b)!=EOF))
    {
        cout<<sol(b)-sol(a-1)<<endl;
    }
    //system("pause");
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/08/17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 做题总结——Fear Factoring
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档