2 2 3 3 5
1 1
这个题一看 ,问区间内最大的素因子个数,素数筛预处理+素因子分解果断超时 优化到不能再优化 依旧超时 how?
又是思维固化了orz 问素数个数不一定要求出素数啊 ~ init()函数用以求出每个数的素数种类 num[ ][ ]数组干嘛的 困扰了我一天 一重维度是每个数 另一重是每个数的质因子种类数
什么跟什么啊这是  ̄□ ̄|| 然后还把前一行的复制到下一行 下一行还有++ ……直到我枚举了前几个数
i\f[i] | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
2 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
3 | 2 | 0 | 0 | 0 | 0 | 0 | 0 |
4 | 3 | 0 | 0 | 0 | 0 | 0 | 0 |
5 | 4 | 0 | 0 | 0 | 0 | 0 | 0 |
6 | 4 | 1 | 0 | 0 | 0 | 0 | 0 |
7 | 5 | 1 | 0 | 0 | 0 | 0 | 0 |
8 | 6 | 1 | 0 | 0 | 0 | 0 | 0 |
9 | 7 | 1 | 0 | 0 | 0 | 0 | 0 |
10 | 7 | 2 | 0 | 0 | 0 | 0 | 0 |
11 | 8 | 2 | 0 | 0 | 0 | 0 | 0 |
num[ ][ ]表示截止到某数 有1、2、3、……个素因子种类的数有多少个 嗯嗯 求区间减一下就好了
#include<stdio.h> #include<iostream> #include<algorithm> #include<string> #include<string.h> #include<math.h> #include<limits.h> #include<time.h> #include<stdlib.h> #include<map> #include<queue> #include<set> #include<stack> #include<vector> #define LL long long using namespace std; int f[1000005]; int num[1000005][8]; void init() { for(int i = 2; i < 1000005; i++) { if(f[i] == 0) { f[i] = 1; for(int j = i + i; j < 1000005; j += i) f[j]++; } } for(int i = 2; i < 1000005; i++) { memcpy(num[i], num[i - 1], sizeof num[i - 1]); num[i][f[i]]++; } } int main() { init(); int T; while(~scanf("%d", &T)) { while(T--) { int l, r; scanf("%d%d", &l, &r); int a[8] = {0}; for(int i = 1; i < 8; i++) a[i] = num[r][i] - num[l - 1][i]; int ans = 1; for(int i = 7; i > 0; i--) if(a[i] > 1) { ans = i; break; } if(a[4] && a[2]) ans = max(ans, 2); if(a[6] && a[3]) ans = max(ans, 3); printf("%d\n", ans); } } return 0; }