洛谷 P1662 世紀難題 數7 打表,模擬

2021-08-07 01:35:18 字數 1719 閱讀 3546

題目鏈結

題目描述

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。由於火星上非常乾燥,經常引發火...