最大因子数
Time Limit : 10000/5000ms (Java/Other) Memory Limit : 65535/65535K (Java/Other)
Total Submission(s) : 35 Accepted Submission(s) : 16
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
定义f(n)为整数n的因子数,如f(9) = 3(分别是1,3,9).
定义g(n)=k,整数k是满足f(k) = max{f(i)|0<i<=n}的最小整数,现在给出n让你求g(n).
定义g(n)=k,整数k是满足f(k) = max{f(i)|0<i<=n}的最小整数,现在给出n让你求g(n).
Input
首先输入一个整数t(t<=10^5)表示测试数据的组数。
接下来t行测试数据每行为一个正整数ai(ai<=10^7)表示要你求g(ai).
接下来t行测试数据每行为一个正整数ai(ai<=10^7)表示要你求g(ai).
Output
对于每个测试数据输出g(ai).
Sample Input
5 1 2 3 4 5
Sample Output
1 2 2 4 4
Author
Source
xianbin5
// 求1~ai范围内因子最多的那个数,有多个的话求最小的那个
//筛选法求因子数量
//昨天就没想到这方法、不过写出来在我自己电脑里跑了7-8秒、看来我的电脑配置、
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <cmath>
#define N 10000001
using namespace std;
int dp[N];
void del()
{
int i,j;
for(i=2;i<=5000000;i++)
for(j=i;j<N;j+=i)
dp[j]++;
int index=1,max=0;dp[1]=1;
for(i=2;i<N;i++)
{
if(dp[i]>max)
{
max=dp[i];
dp[i]=i;
index=i;
}
else
{
dp[i]=index;
}
}
}
int main()
{
del();
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
printf("%d\n",dp[n]);
}
return 0;
}