@tenlee
2015-07-28T11:42:26.000000Z
字数 1383
阅读 1735
HDUOJ
函数
其中
数据范围
2 // T
2 3 //L=2, R=3,f(2)=1, f(3)=1,故答案为 1
因为R最大为
所以一定存在
f(x)很容易 求得
故只需要知道L R区间内有多少个 1,2...7 即可
可以 用s[i][j]保存前i个F中j的个数
//Author LJH//www.cnblogs.com/tenlee#include <cstdio>#include <cstdlib>#include <cstring>#include <cctype>#include <cmath>#include <algorithm>#include <vector>#include <queue>#include <stack>#include <map>#define clc(a, b) memset(a, b, sizeof(a))using namespace std;const int inf = 0x3f;const int INF = 0x3f3f3f3f;const int maxn = 1e6+5;int nu[maxn], s[maxn][10], ha[10];void Init(){clc(nu, 0);clc(s, 0);for(int i = 2; i < maxn; i++){if(nu[i]) continue;nu[i] = 1;for(int j = 2; j * i < maxn; j++){nu[j*i]++;}}s[2][1] = 1;for(int i = 3; i < maxn; i++){for(int j = 1; j <= 7; j++){s[i][j] = s[i-1][j];}s[i][nu[i]]++;}}int GCD(int x, int y){return y == 0 ? x : GCD(y, x%y);}int main(){int l, r, T, k;int nlr[10], a[20];Init();scanf("%d", &T);while(T--){scanf("%d %d", &l, &r);k = 0;for(int i = 1; i <= 7; i++){nlr[i] = s[r][i] - s[l][i];if(i == nu[l] ) nlr[i]++;//printf("i = %d, %d\n", i, nlr[i]);if(nlr[i] >= 2){a[k++] = i; a[k++] = i;}else if(nlr[i] == 1)a[k++] = i;}int ma = 1;for(int i = 0; i < k-1; i++){for(int j = i+1; j < k; j++){ma = max(GCD(a[i], a[j]), ma);}}printf("%d\n", ma);}return 0;}