标签:
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 698 Accepted Submission(s): 328
/** 题意:给出一个区间,然后求区间的数的质因子个数之间的最大公约数 思路:枚举2~N之间的每个数的质因子的个数,计算L ~ R 之间的数的 质因子的个数,因为之前打过表,2~N之间的最大的质因子个数是8 所以,计算L ~ R 之间的1~7出现的次数,然后进行统计枚举, 一道很简单的题,被自己蠢哭了 **/ #include <iostream> #include <cmath> #include <algorithm> #include <stdio.h> #include <string.h> #define maxn 1000000+10 using namespace std; int num[maxn]; int sum[maxn][10]; int mmap[10]; int temp[20]; void init() { memset(num,0,sizeof(num)); memset(sum,0,sizeof(sum)); for(int i=2;i<maxn;i++) { if(num[i]) continue; num[i] = 1; for(int j=2;j*i<maxn;j++) { num[j*i] ++; } } sum[2][1] = 1; for(int i=3;i<maxn;i++) { for(int j=1;j<=7;j++) { sum[i][j] = sum[i-1][j]; } sum[i][num[i]]++; } } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int T; scanf("%d",&T); init(); while(T--) { int left,right; scanf("%d %d",&left,&right); int cet = 0; memset(temp,0,sizeof(temp)); memset(mmap,0,sizeof(mmap)); for(int i=1;i<=7;i++) { mmap[i] = sum[right][i] - sum[left][i]; if(num[left] == i)mmap[i]++; if(mmap[i] >= 2) { temp[cet++] = i; temp[cet++] = i; } else if(mmap[i] == 1) temp[cet++] = i; } int mmax = 0; for(int i=0;i<cet;i++) { for(int j=i+1;j<cet;j++) { mmax = max(mmax,__gcd(temp[i],temp[j])); } } printf("%d\n",mmax); } return 0; }
标签:
原文地址:http://www.cnblogs.com/chenyang920/p/4684579.html