题解:
#include<cstdio> #include<cstring> using namespace std; const int MAX = 2000; int p[MAX], a[MAX], pn;; void prime () { int i, j; memset(a,0,sizeof(a)); p[1] = 1; pn = 1; for ( i = 2; i < MAX; i++ ) { if ( ! a[i] ) p[++pn] = i; for ( j = 2; j <= pn && i*p[j] < MAX && ( p[j] <= a[i] || a[i] == 0 ); j++ ) a[i*p[j]] = p[j]; } } int bfind ( int l, int r, int num ) { int left = l, right = r; while ( left < right ) { int mid = ( left + right ) / 2; if ( num == p[mid] ) return mid; if ( num < p[mid] ) right = mid - 1; else if ( num > p[mid] ) left = mid + 1; } if ( num >= p[left] ) return left; else return left - 1; } int main() { prime(); int n, c, l, r, m; while ( scanf("%d%d",&n,&c) != EOF ) { m = bfind ( 1, pn, n ); if ( m % 2 ) { l = m / 2 - c + 2; r = m / 2 + c; } else { l = m / 2 - c + 1; r = m / 2 + c; } if ( l < 1 ) l = 1; if ( r > m ) r = m; printf("%d %d:",n,c); for ( int i = l; i <= r; i++ ) printf(" %d",p[i]); printf("\n\n"); } return 0; }