您的位置:首页 > 其它

hdu 5137(简单数学题)

2016-07-05 20:14 281 查看
题目链接:点击打开链接

题意:f(x)是求f的素因子个数 然后给定区间l,r,求l~r之间gcd(f(i),f(j))的最大值

分析:打表,然后就o(1)了;

代码如下:

#include <vector>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
struct sa{
int k;
}p[1000005];
bool phi[1000005];
int a[1000005][10];
int main(){
int t;
scanf("%d",&t);
for(int i=1;i<1000005;i++)
p[i].k=0;
memset(phi,0,sizeof(phi));
phi[1]=true;
for(int i=2;i<1000005;i++){
if(!phi[i]){
for(int j=i;j<1000005;j+=i){
phi[j]=true;
p[j].k++;
}
}
}
memset(a,0,sizeof(a));
for(int i=1;i<=1000005;i++){
for(int j=0;j<=7;j++){
if(j==p[i].k)
a[i][j]=a[i-1][j]+1;
else a[i][j]=a[i-1][j];
}
}
int sum[10];
while(t--){
int n,m;
scanf("%d%d",&n,&m);
memset(sum,0,sizeof(sum));
for(int i=0;i<=7;i++){
sum[i]=a[m][i]-a[n-1][i];
}
// for(int i=0;i<=7;i++)
// cout<<sum[i]<<" ";
// cout<<endl;
if(sum[7]>1)cout<<7<<endl;
else if(sum[6]>1)cout<<6<<endl;
else if(sum[5]>1)cout<<5<<endl;
else if(sum[4]>1)cout<<4<<endl;
else if(sum[3]>1)cout<<3<<endl;
else if(sum[3]>0&&sum[6]>0)cout<<3<<endl;
else if(sum[2]>1)cout<<2<<endl;
else if(sum[2]>0&&(sum[4]>0||sum[6]>0)){
cout<<2<<endl;
}
else cout<<1<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数学