POJ - 3048 区间数的最大质因子
2018-03-13 16:31
253 查看
To improve the organization of his farm, Farmer John labels each of his N (1 <= N <= 5,000) cows with a distinct serial number in the range 1..20,000. Unfortunately, he is unaware that the cows interpret some serial numbers as better than others. In particular, a cow whose serial number has the highest prime factor enjoys the highest social standing among all the other cows.
(Recall that a prime number is just a number that has no divisors except for 1 and itself. The number 7 is prime while the number 6, being divisible by 2 and 3, is not).
Given a set of N (1 <= N <= 5,000) serial numbers in the range 1..20,000, determine the one that has the largest prime factor.
* Lines 2..N+1: The serial numbers to be tested, one per line
19 is a prime factor of 38. No other input number has a larger prime factor.
对于每个n,看最后整除n的素数时是多少 即是n的最大质因子
复杂度为n∗2e4/ln(2e4)n∗2e4/ln(2e4)
所有的合数会被质因子筛去
那我们可以留下最大的这样的质因子
注意这里不能提前n/i < i break 因为我们要留下最大的质因子 而不是仅仅筛去
下面j=i*2 而不是i * i 同理
时间复杂度O(nlogn)
遇到区间的问题
要尽量往筛法 上思考 往往可以将n2/lognn2/logn的 复杂度优化为 nlognnlogn
比如经典的埃拉托斯特尼素数筛法 和欧拉线性筛法
埃塞时间不敌线性筛 但是其能保留一些有效的信息
比如这里的①数的最大质因子
垃圾变宝贝了(:
埃塞还能处理②大区间的素数筛
http://blog.csdn.net/feynman1999/article/details/79533130
对于欧拉素数筛
所有线性筛积性函数都必须基于线性筛素数
这两种方法都是经典的
(Recall that a prime number is just a number that has no divisors except for 1 and itself. The number 7 is prime while the number 6, being divisible by 2 and 3, is not).
Given a set of N (1 <= N <= 5,000) serial numbers in the range 1..20,000, determine the one that has the largest prime factor.
Input
* Line 1: A single integer, N* Lines 2..N+1: The serial numbers to be tested, one per line
Output
* Line 1: The integer with the largest prime factor. If there are more than one, output the one that appears earliest in the input file.Sample Input
4 36 38 40 42
Sample Output
38
Hint
OUTPUT DETAILS:19 is a prime factor of 38. No other input number has a larger prime factor.
思路1
预处理出1~20000的所有素数对于每个n,看最后整除n的素数时是多少 即是n的最大质因子
复杂度为n∗2e4/ln(2e4)n∗2e4/ln(2e4)
代码示例1
//暴力 复杂度为n*2e4/ln(2e4) #include<iostream> using namespace std; const int maxn=2e4+10; bool valid[maxn]; int ans[maxn]; int tot; void get_prime(int n) { tot=0; for(int i=2;i<=n;++i) valid[i]=true; for(int i=2;i<=n;++i){ if(valid[i]){ ans[++tot]=i; } for(int j=1;j<=tot && ans[j] * i <=n ;++j){ valid[i*ans[j]]=false; if(i%ans[j]==0) break; } } } int main() { get_prime(2e4); int t,n,Ans,res; cin>>t; res=2; int sum=t; while(t--) { cin>>n; sum-=n; for(int i=1;i<=tot && ans[i]<=n;++i){ if(n%ans[i]==0 && ans[i]>res){ Ans=n; res=ans[i]; } } } if(sum==0) cout<<1<<endl; else cout<<Ans<<endl; return 0; }
思路2 优化
在埃筛中我们用质数的倍数去筛区间所有的合数会被质因子筛去
那我们可以留下最大的这样的质因子
for(int i=2;i<=n;++i) ans[i]=i; for(int i=2;i<=n;++i){ if(ans[i]==i){//素数 for(int j=i*2;j<=n;j+=i) ans[j]=i; } }
注意这里不能提前n/i < i break 因为我们要留下最大的质因子 而不是仅仅筛去
下面j=i*2 而不是i * i 同理
时间复杂度O(nlogn)
代码示例2
//筛法求 1~n 内数的最大质因数 O(nlogn)
#include<iostream>
using namespace std;
const int maxn=2e4+10;
int ans[maxn];//数的最大质因子 素数就是自己
int tot;
void get_prime(int n)
{
for(int i=2;i<=n;++i) ans[i]=i; for(int i=2;i<=n;++i){ if(ans[i]==i){//素数 for(int j=i*2;j<=n;j+=i) ans[j]=i; } }
}
int main()
{
get_prime(2e4);
int t,n,res,Ans;
cin>>t;
int sum=t;
res=2;
while(t--)
{
cin>>n;
sum-=n;
if(ans
>res){
res=ans
;
Ans=n;
}
}
if(sum==0) cout<<1<<endl;
else<
ec07
/span> cout<<Ans<<endl;
return 0;
}
思考
在素数背景下遇到区间的问题
要尽量往筛法 上思考 往往可以将n2/lognn2/logn的 复杂度优化为 nlognnlogn
比如经典的埃拉托斯特尼素数筛法 和欧拉线性筛法
埃塞时间不敌线性筛 但是其能保留一些有效的信息
比如这里的①数的最大质因子
垃圾变宝贝了(:
埃塞还能处理②大区间的素数筛
http://blog.csdn.net/feynman1999/article/details/79533130
对于欧拉素数筛
所有线性筛积性函数都必须基于线性筛素数
这两种方法都是经典的
相关文章推荐
- poj3048--Max Factor(最大素数因子)
- POJ-3048 求有最大的素数因子的数
- POJ 2796 Feel Good (单调栈 区间最大值)
- Balanced Lineup POJ - 3264(线段树寻找区间最大值最小值)
- POJ - 3680 Intervals 区间图的最大权独立集(最大流)
- poj 3264 线段树区间最大最小值
- poj 2955 区间dp 最大括号匹配数
- POJ 3616 Milking Time(DP,区间和最大)
- POJ 3273 Monthly Expense(区间和最大值最小-二分)
- POJ 2796 Feel Good (单调栈 区间最大值)
- poj--3264Balanced Lineup+ST算法求区间最大最小值
- POJ 3186 Treats for the Cows(区间DP)【区间最大值模板】
- poj 3680 Intervals 【坐标区间离散化 + 最大费用最大流】
- STL有限队列的灵活运用+IO优化+区间最大最小——POJ Sliding Window
- POJ2796 区间最大参考值
- POJ 2796 Feel Good (单调栈 区间最大值)
- poj 3273(二分)区间的最大值
- POJ 题目2892 Tunnel Warfare(线段树单点更新查询,求单点所在最大连续区间长度)
- poj3264 Balanced Lineup(求区间的最大值与最小值之差)
- poj 2823 单调队列 (求特定长度区间的最大最小值)