牛客練習賽13 D 幸運數字 (思維)

2021-08-17 03:18:48 字數 1144 閱讀 9459

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 262144k,其他語言524288k

64bit io format: %lld

定義乙個數字為幸運數字當且僅當它的所有數字都是4或者7。

比如說,47、744、4都是幸運數字而5、17、467都不是。

現在想知道在1...n的第k小的排列(permutation,中,有多少個幸運數字所在的位置的序號也是幸運數字。

第一行兩個整數n,k。

1 <= n,k <= 1000,000,000

乙個數字表示答案。

如果n沒有k個排列,輸出-1。

示例1

7 4

1

1 2 3 4 6 7 5

示例2

4 7

1

2 1 3 4

思路:因為15!>=1e10>k。所以最後的15個數的全排列就已經大於等於k了,所以前面的n-15個數字置是不變的。對於前面的n-15個數,因為幸運數隻由4和7組成,所以幸運數的數量其實是很少的,我們可以先構造出1e10以內的幸運數,然後算出n-15以內的幸運數的個數。對於後面的15個數排列,我們乙個乙個來判斷,具體看**。

其實這題挺像 hihocoder#1703: 第k小先序遍歷.。 

#includeusing namespace std;

const int max=50;

const int mod=1e9+7;

typedef long long ll;

vectorp,q;

ll f[100];

ll cla(int x,int y)

return ans;

}int check(ll x)//判斷x是否是幸運數

return 1;

}int solve(ll index,ll k)//index代表位置,k代表第k小的字典序

tot+=f[siz-1];//之前以q[0...i-1]開頭的排列數+以q[i]開頭的排列數》n>>k;

int ans=-1;

for(int i=1;i<=15&&i<=n;i++)

}cout<

牛客練習賽13 幸運數字

定義乙個數字為幸運數字當且僅當它的所有數字都是4或者7。比如說,47 744 4都是幸運數字而5 17 467都不是。假設現在有乙個數字d,現在想在d上重複k次操作。假設d有n位,用d1,d2,dn表示。對於每次操作,我們想要找到最小的x x n 使得dx 4並且dx 1 7。如果x為奇數,那麼我們...

牛客練習賽13 幸運數字

定義乙個數字為幸運數字當且僅當它的所有數字都是4或者7。比如說,47 744 4都是幸運數字而5 17 467都不是。定義next x 為大於等於x的第乙個幸運數字。給定l,r,請求出next l next l 1 next r 1 next r 兩個整數l和r 1 l r 1000,000,000...

牛客練習賽13 C 幸運數字 思維

傳送門 思路 簡單的推理一下,對於正常的情況只要從左到右暴力判斷就行。對於47數字很多雜糅的話,我們只需要判斷如果s i 1 4 s i 1 7的話 如果s i 4且i是偶數且k此時是奇數s i 變成7 include define debug a cout a a endl define ll l...