【题目】
1409: 因子和
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 255 Solved: 63
[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
【题解】
把每个数的因子和用素数筛法算出来进行比较,再输出因子。
好像没有挂过素数筛就借这题挂一下。时间复杂度O(n)。
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;
}
【代码】
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6;
int sum[maxn+5];
void init()
{
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()
{
init();
int a,b,i;
while(~scanf("%d%d",&a,&b))
{
int c=0,t;
for(i=a;i<=b;i++)
if(sum[i]>c)
{
c=sum[i];
t=i;
}
printf("%d = 1",t);
for(i=2;i<=t/2;i++)
if(t%i==0)
printf(" + %d",i);
putchar('\n');
}
return 0;
}