爷的第一篇CSDN博客!

爷的第一篇CSDN博客!

ZCMU-1409
1409: 因子和
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 329 Solved: 90
[Submit][Status][Web Board]
Description
求一个数的因子和很简单,所以小明很懒就想让你帮忙算一下区间a到b中哪个数的因子和最大,并输出这个数和他的每个因子。

Input
输入a和b,(0<a<=b<10^6).

Output
输出这个数和他的每个因子(相同情况输出最小的),因子从小到大输出。

Sample Input
1 10
Sample Output
10 = 1 + 2 + 5

前言

这是菜狗入学来第一篇博客,今天就简单记录下素数筛的简单应用吧!
(作为一名ACMer,要养成写博客的习惯啊!)

一、素数筛是什么?

1.算术基本定理:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积
2. 若一个数可以进行因数分解,则得到的两个数一定是有一个>=sqrt(x),另一个<=sqrt(x).

依照我的理解,就是将数字从2到maxn遍历,然后将后面的这些数的因子记录下来,就像个筛子一样,以此做到减少时间复杂度的作用,大大提高效率

二、如何使用?

这是素数筛执行的函数,看一遍基本就懂了,这里写在这里就是为了防止忘记,好记性不如烂笔头对吧!

int prime[maxn];
void isprime()
{
    int i,j;
    memset(prime,1,sizeof(prime));
    for(i=2;i<=maxn/2;i++)
        for(j=i+i;j<maxn;j+=i)
            prime[j]=0;
}

总结

以下是AC代码,其实如果知道素数筛的话也就是个水题

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
int arr[maxn],sum[maxn];
int t = 0;
void getsum()//素数筛法,预处理每一个数的因子和,后面只要查找就行了,不用重复计算
{
    int i,j;
    memset(sum,1,sizeof(sum));
    for(i = 2;i <= maxn / 2;i++)
    {
        for(j = i + i;j < maxn;j += i)
            sum[j] += i;
    }
}
int main(){
    
        getsum();
        int a,b;
        while(~scanf("%d%d",&a,&b))
        {
            int maxsum = 0,dis = 0;
            for(int i = a;i <= b;i++)
            {
                if(sum[i] > maxsum)
                {
                    maxsum = sum[i];
                    dis = i;//记录因子和最大的那个数
                }
                
            }
            printf("%d = 1",dis);
            for(int i=2;i<=dis/2;i++)
                if(dis % i==0)printf(" + %d",i);
            cout << endl;
        }
    return 0;
    }

就这样吧。
感觉写博客还挺有意思的,还可以梳理一遍知识,争取一天一篇!

猜你喜欢

转载自blog.csdn.net/DAVID3A/article/details/114005266