题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5317
fn表示n的质因数个数,给定区间,求区间内两数的GCD的最大值。
预处理出f之后再查询。注意f<=7,所以可以出一个数组dp[n][8]来统计数字n中f的出现次数。
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 #include <iostream> 6 #include <cmath> 7 #include <queue> 8 #include <map> 9 #include <stack> 10 #include <list> 11 #include <vector> 12 13 using namespace std; 14 15 const int maxn = 1000010; 16 int ll, rr; 17 int dp[maxn][8]; //f不会超过7,所以分别统计到i的时候各数出现的次数 18 int f[maxn]; 19 int enu[8]; 20 21 void init() { 22 memset(f, 0, sizeof(f)); 23 memset(dp, 0, sizeof(dp)); 24 for(int i = 2; i < maxn; i++) { 25 if(!f[i]) { 26 for(int j = i; j < maxn; j+=i) { 27 f[j]++; 28 } 29 } 30 } 31 for(int i = 2; i < maxn; i++) { 32 int tmp = i; 33 for(int j = 1; j <= 7; j++) { 34 dp[i][j] = (f[i] == j) ? (dp[i-1][j]+1) : dp[i-1][j]; 35 } 36 } 37 } 38 39 int main() { 40 // freopen("in", "r", stdin); 41 int T; 42 init(); 43 scanf("%d", &T); 44 while(T--) { 45 scanf("%d %d", &ll, &rr); 46 for(int i = 1; i <= 7; i++) { 47 enu[i] = dp[rr][i] - dp[ll-1][i]; 48 } 49 int ans = 1; 50 for(int i = 7; i >= 1; i--) { 51 if(enu[i] > 1) { 52 ans = i; 53 break; 54 } 55 } 56 printf("%d\n", ans); 57 } 58 return 0; 59 }