试题 历届试题 幸运数(二分)
試題 歷屆試題 幸運(yùn)數(shù)
資源限制
時(shí)間限制:1.0s 內(nèi)存限制:256.0MB
題描述
幸運(yùn)數(shù)是波蘭數(shù)學(xué)家烏拉姆命名的。它采用與生成素?cái)?shù)類似的“篩法”生成
。
首先從1開始寫出自然數(shù)1,2,3,4,5,6,…
1 就是第一個(gè)幸運(yùn)數(shù)。
我們從2這個(gè)數(shù)開始。把所有序號(hào)能被2整除的項(xiàng)刪除,變?yōu)?#xff1a;
1 _ 3 _ 5 _ 7 _ 9 …
把它們縮緊,重新記序,為:
1 3 5 7 9 … 。這時(shí),3為第2個(gè)幸運(yùn)數(shù),然后把所有能被3整除的序號(hào)位置的數(shù)刪去。注意,是序號(hào)位置,不是那個(gè)數(shù)本身能否被3整除!! 刪除的應(yīng)該是5,11, 17, …
此時(shí)7為第3個(gè)幸運(yùn)數(shù),然后再刪去序號(hào)位置能被7整除的(19,39,…)
最后剩下的序列類似:
1, 3, 7, 9, 13, 15, 21, 25, 31, 33, 37, 43, 49, 51, 63, 67, 69, 73, 75, 79, …
輸入格式
輸入兩個(gè)正整數(shù)m n, 用空格分開 (m < n < 1000*1000)
輸出格式
程序輸出 位于m和n之間的幸運(yùn)數(shù)的個(gè)數(shù)(不包含m和n)。
樣例輸入1
樣例輸出1
5樣例輸入2
30 69樣例輸出2
8思路:
根據(jù)題意模擬篩出需要的數(shù)據(jù),
然后二分查找即可。
具體看代碼~
代碼:
#include <iostream> const int N = 1e6+5; using namespace std; int a[N]; bool vis[N]; //預(yù)先篩選 int solve() {int k = 0;for(int i = 1; i < 1e6; i+=2){a[++k] = i;}int id = 1;while(1){bool flag = false;int siz = k;for(int i = a[++id]; i <= siz; i+=a[id]){if(i % a[id] == 0){flag = true;vis[a[i]] = true;}}if(!flag) return k;k = 0;for(int i = 1; i <= siz; ++i){if(!vis[a[i]]) a[++k] = a[i];}} } //第一個(gè)大于v int getPos1(int k,int v) {int l = 1,r = k;int res = 0;while(l <= r){int mid = (l + r) >> 1;if(a[mid] > v){res = mid;r = mid - 1;}else l = mid + 1;}return res; }//最后一個(gè)小于v int getPos2(int k,int v) {int l = 1,r = k;int res = 0;while(l <= r){int mid = (l + r) >> 1;if(a[mid] < v){res = mid;l = mid + 1;}else r = mid - 1;}return res; }int main() {int n,m;int k = solve();cin>>m>>n;int ans = getPos2(k,n)-getPos1(k,m) + 1;cout<<ans<<endl;return 0; }總結(jié)
以上是生活随笔為你收集整理的试题 历届试题 幸运数(二分)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 试题 历届试题 翻硬币(贪心)
- 下一篇: 试题 历届试题 包子凑数(dp)