題目鏈結
題目描述
1337個人排成乙個圈,從1號人開始報數,初始方向是1,2,3…。如果某個人報的數是7的倍數或數字中含有7,那麼報數的方向就反一下。問報數字x的是哪個人?
比如初始20個數字的情況是:
1:1 2:2 3:3 4:4 5:5 6:6 7:7 6:8 5:9 4:10 3:11 2:12 1:13 1337:14 1:15 2:16 3:17 2:18 1:19 1337:20
輸入輸出格式
輸入格式:
一行乙個數x。
【資料規模】
對於30%的資料,滿足x≤10^6;
對於90%的資料,滿足x≤10^8;
對於100%的資料,滿足x≤10^9.
輸出格式:
一行乙個數表示最終報數字x的是哪個人。
這,就是暴力的下場
打個包括所有能使方向改變的數的表,然後二分查詢,這樣的複雜度感覺會有所降低,但不幸的是10^9資料太大打出的表居然大到6g(不要問我怎麼知道的才不是我表打錯了)
我們可以將i*10^6當做每段的分界點,則每一段僅有最多數106
個數字,定義su
m[i]
、dir
[i] 分別為數到i∗
106的人是哪位以及當前的朝向,打出di
r 和su
m 的表,這樣就可以將問題轉化為從su
m[n/
106] 位置以di
r[n/
106] 的初始方向數到n−
n/106
∗106 的問題,將109
的問題轉化為106
的問題。
**:
#include
#include
#include
using
namespace
std;
int n,num,seat;
int seq;
bool t;
int sta=0;
int a[26];
int len;
int sum[1010]=;
int dir[1010]=;
inline
void jw();
inline
void cs();
inline
bool pd(int);
inline
void limit();
inline
void csh(int);
int main()
printf("%d",seat);
return0;}
inline
bool pd(int k)
inline
void limit()
inline
void cs()
}inline
void csh(int k)
if(k/10%10)
if(k/100%10)
if(k/1000%10)
if(k/10000%10)
if(k/100000%10)
if(k/1000000%10)
if(k/10000000%10)
if(k/100000000%10)
}
洛谷P5049 洛谷P5022 題解 旅行
原題 資料加強版 加強版 參考你谷題解 終於調過了 又是一如既往的申必錯誤 noi plus石錘了 原題的資料允許我們 o n 2 暴力斷邊,但是加強版的資料達到了 n log n 級別,我們必須在斷邊這一環節尋求更好的解法。考慮我們進入環後在何處回溯 根據繼續走環走到的點分類 設當前已經從 b 走...
洛谷P4799 世界冰球錦標賽 折半搜尋
給出n 40 n leq40 n 40 個比賽,給出每個比賽的票價以及m 1 e18 m leq1e18 m 1e18 表示你的積蓄。然後求問能看的比賽的方案數是多少。n nn如果能夠再小一些就可以直接暴搜了,但是搜不得。但是拆成兩半然後把兩邊所有的可行方案的總和全部儲存下來,對左邊的某個方案x x...
洛谷練習P2279 P1346
2020年,人類在火星上建立了乙個龐大的基地群,總共有n個基地。起初為了節約材料,人類只修建了n 1條道路來連線這些基地,並且每兩個基地都能夠通過道路到達,所以所有的基地形成了乙個巨大的樹狀結構。如果基地a到基地b至少要經過d條道路的話,我們稱基地a到基地b的距離為d。由於火星上非常乾燥,經常引發火...