1. 程式人生 > >cf round 470 b Primal Sport

cf round 470 b Primal Sport

好菜啊..這種數學題,基本只能靠猜..
猜了猜,打了打表,苟過了…

#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
#define debug(x) std::cerr << #x << " = " << (x) << std::endl
typedef long long LL;
const int MAXN = 1e6+17;
int prime[1100000
],primesize=0; bool isprime[11000000]; void sieve(int listsize){ memset(isprime, 1, sizeof(isprime)); isprime[1] = false; for(int i=2;i<=listsize;i++){ if(isprime[i]) prime[++primesize]=i; for(int j = 1; j <= primesize && i*prime[j] <= listsize;j++){ isprime[i*prime[j]] = false
; if(i%prime[j] == 0) break; } } } int get(int n) { int res = 2; for (int i = 1; i < primesize; ++i) { if(n<=prime[i]) break; while(n%prime[i]==0) { n/=prime[i]; res = max(res,prime[i]); } } res = max(res,n); return
res; } int main(int argc ,char const *argv[]) { #ifdef noob freopen("Input.txt","r",stdin);freopen("Output.txt","w",stdout); #endif sieve(1000000); int n; cin>>n; int ans = n; if(ans%2==0) ans--; for (int i = n-get(n)+1,k=0; i < n&&k<1000; ++i,++k) { int tmp = get(i); if(i==tmp) continue; ans = min(ans,i-tmp+1); } cout<<ans<<endl; return 0; }

看了下部落格和別人的程式碼,大概知道這題的關鍵就是要找到最大素因數,我找最大素因數的方法很蠢,所以其實是過不了的,應該在篩素數的時候就直接篩掉,但是我的這個篩,雖然確實是比原始篩更快的,但是這快,沒有實際意義,用原版完全可以.
至於為什麼我用k<1000也可以苟過,應該是他資料弱了..