C 之路高階 P2022

2022-08-02 22:09:16 字數 1491 閱讀 6825

讓我們來考慮1到n的正整數集合。讓我們把集合中的元素按照字典序排列,例如當n=11時,其順序應該為:1,10,11,2,3,4,5,6,7,8,9。

定義k在n個數中的位置為q(n,k),例如q(11,2)=4。現在給出整數k和m,要求找到最小的n,使得q(n,k)=m。

輸入格式:

輸入檔案只有一行,是兩個整數k和m。

輸出格式:

輸出檔案只有一行,是最小的n,如果不存在這樣的n就輸出0。

題解對於該題來說,我們只需考慮比k小的數就可以了,比k小的自然數中,比k小的字典序的個數=k-1。

eg:對於456而言,從100~455 都可以,有456-100-1個。

從10~45 也可以 有(45-10-1) +1 //45是可以的,以為456還有後面的數,所以45也小於456(字典序)

從1~4中也都可以,有(4-1-1)+1//原因同上

由以上,我們便可以找出規律:比k字典序小的數等於ans=(k%10-1)//直到k=0;ans+=(t-1),因為除了位數與原數相同的的情況,等於是成立的,見以上標紅部分。

規律找到,然後逐漸擴大n,以k的10^i擴大,當ans>m時,ans=(k*10^i-(ans-(m-1)+1))//減出多餘的部分。

1 #include2 #include3 #include4

#define ll long long56

using

namespace

std;

78 ll n,m,k,cnt,base=1;9

10 ll fj[21],s[21

];11

12void

get(ll x)

13base/=10;16

for (int i=1;i<=t;i++) fj[i]=s[t-i+1

];17 cnt+=t-1;18

for (int i=t;i>=1;i--)19

26}2728

intmain()

2933 ll p=k-base,c=k;

34for (;cnt1

;)35

39 n=max(k,c-(cnt-m+2

));40 cout41return0;

42 }

輸入樣例#1:

sample 1: 2 4

sample 2: 100000001 1000000000

這裡sample 1 和 2是分開的兩個資料點。

輸出樣例#1:

sample 1: 11

sample 2: 100000000888888879

【資料約定】

40%的資料,1<=k,m<=10^5;

100%的資料,1<=k,m<=10^9。

洛谷 P2022 有趣的數

讓我們來考慮1到n的正整數集合。讓我們把集合中的元素按照字典序排列,例如當n 11時,其順序應該為 1,10,11,2,3,4,5,6,7,8,9。定義k在n個數中的位置為q n,k 例如q 11,2 4。現在給出整數k和m,要求找到最小的n,使得q n,k m。輸入輸出格式 輸入檔案只有一行,是兩...

洛谷P2022 有趣的數

題目鏈結 首先求出1 k中有多少個在k前面的數的個數,若 m,則無解 比如12345,從第一位開始,1 0 1 共2個 1 0 1 12 10 12共3個 12 10 1 123 100 123 共24個 123 100 1 1234 1000 1234 共235個 1234 1000 1 之後看還...

洛谷 P2022 有趣的數

我們把乙個數稱為有趣的,當且僅當 它的數字只包含0,1,2,3,且這四個數字都出現過至少一次。所有的0都出現在所有的1之前,而所有的2都出現在所有的3之前。最高位數字不為0。因此,符合我們定義的最小的有趣的數是2013。除此以外,4位的有趣的數還有兩個 2031和2301。請計算恰好有n位的有趣的數...