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 }
View Code

相关文章: