爷的第一篇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;
}
就这样吧。
感觉写博客还挺有意思的,还可以梳理一遍知识,争取一天一篇!