D - Delete Prime Gym - 102875D
生活随笔
收集整理的這篇文章主要介紹了
D - Delete Prime Gym - 102875D
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
D - Delete Prime Gym - 102875D
題意:
長度為n的序列,每次從中取出編號為1或質數的數,組成新的序列d
現在給一個k,問序列中哪一位的值是k以及序列中第k位是多少
共T個詢問
T< = 2 * 105
n,k< = 105
題解:
其實這題巨簡單。。。
一開始被嚇住了,看了看數據范圍,不知道d數組怎么求
其實直接暴力求數組d就可以,不要想太多,先篩出不符合要求的數,然后依次將這些數按照第一批,第二批的順序存在vec[][]中
vec[i][j]表示第i批存的第j個數是。。
然后詢問1和2直接用二分查找就可以
(自己一開始想太多了)
代碼:
#include <bits/stdc++.h> using namespace std; const int N = 1e6 + 10; vector<int> ans[110]; bool vis[N]; int a[N], k = 0; inline void get_prime() {for (int i = 2; i < N; i++) {if (vis[i] == 0) {for (int j = i + i; j < N; j += i) vis[j] = 1;}} } inline void get_array() {int r = 1e6, l, i;for (i = 1; i < N; i++) a[i] = i;while (r) {l = 1;for (i = 1; i <= r; i++) {if (vis[i] == 0) {ans[k].push_back(a[i]);} elsea[l++] = a[i];}ans[k++].push_back(1e7);r = l - 1;} } int solve1(int n, int m) {//根據結果選位置 int ans1 = 0;for (int i = 0; i < k; i++) {int x = upper_bound(ans[i].begin(), ans[i].end(), n) - ans[i].begin();int y =upper_bound(ans[i].begin(), ans[i].end(), m) - ans[i].begin() - 1;if (ans[i][y] == m) {ans1 += y + 1;break;} elseans1 += x;}return ans1; } int solve2(int n, int m) {//輸出第k位 int ans2;for (int i = 0; i < k; i++) {int x = upper_bound(ans[i].begin(), ans[i].end(), n) - ans[i].begin();if (m > x)m -= x;else {ans2 = ans[i][m - 1];break;}}return ans2; } int main() {ios::sync_with_stdio(false);get_prime();get_array();int T, n, m, i, j, k;cin >> T;while (T--) {cin >> k >> n >> m;if (k == 1)cout << solve1(n, m) << '\n';elsecout << solve2(n, m) << '\n';}return 0; }總結
以上是生活随笔為你收集整理的D - Delete Prime Gym - 102875D的全部內容,希望文章能夠幫你解決所遇到的問題。