1. 程式人生 > >10856 Recover Factorial(二分查詢)

10856 Recover Factorial(二分查詢)

題目:(Sample Output是錯的!要不是因為題目裡面有描述輸出,估計沒人做的對吧敲打


這個題目,和這個OJ裡面的另外一個題目有著緊密的聯絡。點選開啟我的部落格

(這一點,其實從標題也看的出來)

把這個題目的程式碼改改就能得到這個題目的程式碼。

在編程式碼的過程中就已經用到了二分了,可以確定,需要的陣列大小的大致範圍,大於2700000,小與2750000

程式碼:

#include<iostream>
using namespacestd;

int sum[2750000];

bool isprime(int n)
{
	if (n == 2)return true;
	if (n % 2 ==
0)return false; for (int i = 3; i*i <= n; i += 2)if (n%i == 0)return false; return true; } int main() { for (int i = 0; i < 2750000; i++)sum[i] = 0; for (int i = 2; i < 2750000; i++) { if (isprime(i)) { long long m = i; while (m < 2750000) { for (int j = m; j < 2750000; j += m)sum[
j]++; m *= i; } } } for (int i = 1; i < 2750000; i++)sum[i] += sum[i - 1]; int n, low, high, mid; int cas = 1; while (cin >> n) { if (n < 0)break; cout << "Case " << cas++ << ": "; low = 0, high = 2749999; while (low < high - 1) { mid = (low + high)
/ 2; if (sum[mid] < n)low = mid; else if (sum[mid]>n)high = mid; else break; } if (n == 0)mid = 0; if (sum[mid] == n)cout << mid << "!\n"; else cout << "Not possible.\n"; } return 0; }

在查詢的時候,還是二分,因為陣列已經是升序的了。

不過,有個特殊情況,sum[0]=sum[1]=0,這是唯一的不是嚴格遞增的地方,需要特判。

相關推薦

10856 Recover Factorial二分查詢

題目:(Sample Output是錯的!要不是因為題目裡面有描述輸出,估計沒人做的對吧) 這個題目,和這個OJ裡面的另外一個題目有著緊密的聯絡。點選開啟我的部落格 (這一點,其實從標題也看的出來)

真題2001 折半查詢二分查詢

題目:折半查詢(二分查詢),她僅適合有序的順序表。 基本思想:首先將給定值key與表中中間位置元素的關鍵字比較,若想等,則查詢成功,返回該元素的儲存位置;若不等則查詢元素只能在中間元素以外的前半部分或者後半部分。然後在縮小的範圍內繼續進行同樣的查詢,如此重複直到找到為止,或者確定表中沒有所需

最大化平均值二分查詢

int n,k; int w[max_n]; int v[max_n]; double y[max_n]; bool c(double x) {     for(int i=0;i<n;i++)         y[i]=v[i]-x*w[i];     sort(y,

hdu 3763 CD二分查詢 Java實現

   題意:求集合A和B中有幾個相同的元素,其中集合中元素已經按升序排好,集合的元素個數n<=1000000    分析:集合中的元素已經按升序排好,只要對B中每個元素在A中進行二分查詢就解

友好城市二分查詢【DP】

> Description Palmia國有一條橫貫東西的大河,河有筆直的南北兩岸,岸上各有位置各不相同的N個城市。北岸的每個城市有且僅有一個友好城市在南岸,而且不同城市的友好城市不相同。 每對友好城市都向政府申請在河上開闢一條航線連線兩個城市,但是由於河

POJ 3273 Monthly Expense二分查詢

Farmer John is an astounding accounting wizard and has realized he might run out of money to run the farm. He has already calculated and r

用c語言折半查詢演算法二分查詢

二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好,佔用系統記憶體較少;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查

折半查詢二分查詢

在整形有序陣列中查詢想要的數字,找到了返回下標,找不到返回-1. #include<stdio.h> int main(){ double arr[] = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; int to_f

Vasya and Robot二分查詢

題目傳送: 題意: 給出一段錯誤路徑,現要求修改路徑,使得能夠成功到達目標座標。求最小修改量。  思路: 若最終能使改動後到達目標座標(tarx,tary),設改動區間長度len,記刪除len內容後的位置座標為(nowx,nowy),計算出(

PAT甲級 1044 Shopping in Mars二分查詢

1044 Shopping in Mars (25 分) Shopping in Mars is quite a different experience. The Mars people pay by chained diamonds. Each diamond has

51Nod1090 3個數和為0二分查詢

這道題和基礎題裡面的1001 陣列中和等於K的數對這道題差不多。 思路:先排升序,讓數組裡的兩個數a[i]a[j]相加,然後在陣列下標j之後找(0-a[i[-a[j])。 #include<i

二分查詢

題目描述 楠楠在網上刷題,感覺第一題:求兩數的和(A+B Problem)太無聊了,於是增加了一題:A-B Problem,難倒了一群小朋友,哈哈。 題目是這樣的:給出N個從小到大排好序的整數,一個差值C,要求在這N個整數中找兩個數A和B,使得A-B=C,問這樣的方案有多少種?  例如

codeforces 1073C Vasya and Robot二分查詢

題目描述: 傳送門 此題是對區間長度進行二分查詢。 對於一個區間長度為len的區間來說,算出沒加這塊區間的座標,然後算出與終點座標的絕對距離dis,如果dis<=len&&dis和len的奇偶性相同則可以走的目的地。然後縮小區間長度。否則增大區間長

4 Values whose Sum is 0 POJ - 2785二分查詢

The SUM problem can be formulated as follows: given four lists A, B, C, D of integer values, compute how many quadruplet (a, b, c, d ) ∈ A x B x C

【C/C++】折半查詢二分查詢

一、二分查詢 在C和C++裡,二分查詢是針對有序陣列所用的一種快速查詢元素的方法。 二、二分查詢的條件以及優缺點 條件:針對有序陣列(元素從小到大或從大到小) 優點:查詢速度較快,時間複雜度為O(n) 缺點:有硬性條件的限制,而且即使查到後,插入與刪除困難。 三、圖片詳解

資料結構學習筆記四二分查詢

一、什麼是二分查詢        二分查詢針對的是一個有序的資料集合,每次都通過更區間的中間元素做對比,將要查詢的區間縮小為原來的一半,直到找到要查詢的元素,或者區間被縮小為0。其時間複雜度為O(logn)。

UVA 714 Copying Books二分查詢未a

Before the invention of book-printing, it was very hard to make a copy of a book. All the contents had to be re-written by hand by so cal

hdu 1969 Pie二分查詢

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1969 Pie Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others

微策略面試題:在旋轉後的陣列中查詢元素二分查詢

版權所有。所有權利保留。 歡迎轉載,轉載時請註明出處: 一個無重複元素的有序陣列,經過若干次旋轉後,得到一個新陣列。比如[1,4,5,8,10,12,56,78]變成[12,56,78,1,4,5,8,10]。 現在要在這個陣列中尋找元素。 其實演算法很簡單,就是用二

BinarySearch二分查詢

2016.7.22 對rank()函式進行了修改: private static int rank(int key, int[] whitelist) { int low = 0; int high = whitelist.length