CF948B Primal Sport
题目链接:http://codeforces.com/contest/948/problem/B
知识点: 素数
解题思路:
\(f(x)\) 表示 \(x\) 的最大素因子。不难想到:\(X_1 \in [X_2 - f(X_2) + 1, X]\),对于这个范围中的每一个非素数 \(X_1\) 求出其对应的最小的 \(X_0 = X_1 - f(X_1) + 1\),找出一个最小的即为答案。
重点是要想到提前打出 \(f()\) 的表。
AC代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn = 1e6+5, inf = 0x3f3f3f3f; 5 bool no_prim[maxn]; 6 int prim[maxn]; 7 int cnt=0; 8 int f[maxn]; 9 10 void init(){ 11 no_prim[0]=no_prim[1]=true; 12 for(int i=2;i<maxn;i++){ 13 if(!no_prim[i]){ 14 prim[cnt++]=i; 15 for(int j=i*2;j<maxn;j+=i){ 16 f[j]=max(f[j],i); 17 no_prim[j]=true; 18 } 19 } 20 } 21 } 22 int main(){ 23 init(); 24 int X; 25 scanf("%d",&X); 26 int ans=inf; 27 for(int i=X-f[X]+1;i<=X;i++){ 28 if(!no_prim[i]) continue; 29 ans=min(ans,i-f[i]+1); 30 } 31 printf("%d\n",ans); 32 return 0; 33 }
“这些年我一直提醒自己一件事情,千万不要自己感动自己。大部分人看似的努力,不过是愚蠢导致的。什么熬夜看书到天亮,连续几天只睡几小时,多久没放假了,如果这些东西也值得夸耀,那么富士康流水线上任何一个人都比你努力多了。人难免天生有自怜的情绪,唯有时刻保持清醒,才能看清真正的价值在哪里。”