日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

D - Delete Prime Gym - 102875D

發布時間:2023/12/3 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。