A. Primal Sport
题意:有两个人轮流玩游戏。给出数X(i-1),轮到的人需要找到一个小于X(i-1)的素数x,然后得到Xi,Xi是x的倍数中大于等于X(i-1)的最小的数。现在已知X2,求最小的X0?
思路:根据题意,X1的取值范围为【X1-X2的最大质因子+1,X2),同理可知X0的取值范围为【X1-X1的最大质因子+1,,X1)。
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 using namespace std; 6 const int maxn = 1000010; 7 int Res[maxn],tmp[maxn]; 8 void Init() 9 { 10 memset(tmp, -1, sizeof(tmp)); 11 for (int i = 2; i < maxn; i++) 12 { 13 if (tmp[i] == -1) 14 { 15 for (int j = 2*i; j < maxn; j += i) tmp[j] = i;//标记质因子 16 } 17 if (tmp[i] == -1) Res[i] = i;//为质数 18 else Res[i] = i - tmp[i] + 1;//不是质数,tmp[i]为最大质因子 19 } 20 } 21 int main() 22 { 23 Init(); 24 int n; 25 scanf("%d", &n); 26 int L = Res[n]; 27 int ans = n; 28 for (int i = L; i < n; i++) ans = min(Res[i], ans); 29 printf("%d\n", ans); 30 return 0; 31 }