AtCoder - 4127
题意:
输入一个n,请你构造n个数,a[1],a[2]….,a[n],并输出,这些数满足
- a[i](1 <= i <=n)为素数,且不大于”55555”。
- a[1],a[2]….,a[n]的值都不同。
- 任去其五个数的和为5的倍数。
思路:
仔细思考,我们首先可以把素数预处理出来,最大的问题是怎么选取这些素数呢,我们再想想应该从个位数开始考虑,发现我们只要令其个位数都为一,必然满足题目要求,也就是说只要个位模5为1就可以了
代码
#include <bits/stdc++.h> #define INF 0x3f3f3f3f #define FOR(i,a,n) for(register int i=a; i<=n; ++i) #define FDR(i,a,n) for(register int i=a; i>=n; --i) #define mem(a) memset(a, 0, sizeof(a)) #define pb push_back() typedef long long ll; typedef unsigned long long ull; using namespace std; const int maxn = 100005; const int MOD = 1000000009; int prime[1000005]; int Mark[1000005]; void Prime(){ int index = 0; for(int i = 2; i <= 100000; i++) { if(Mark[i] == 0){ prime[index++] = i; } for(int j = 0; j < index && prime[j] * i <= 100000; j++) { Mark[i * prime[j]] = 1; if(i % prime[j] == 0){ break; } } } } int main() { ios::sync_with_stdio(false); Prime(); int n; cin >> n; int i = 1; int cnt = 0; while(1) { if(prime[i]%5 == 1) { cout << prime[i] << ' '; cnt++; } if(cnt == n)break; i++; } return 0; }