1. 程式人生 > >牛客國慶集訓派對Day5——L 數論之神(找規律/數論)

牛客國慶集訓派對Day5——L 數論之神(找規律/數論)

題目大意:

終於活成了自己討厭的樣子。

這是她們都還沒長大的時候發生的故事。那個時候,栗子米也不需要為了所謂的愛情苦惱。
她們可以在夏日的午後,花大把的時間去研究生活中一些瑣碎而有趣的事情,比如數論。
有一天西柚柚問了栗子米一個題,她想知道中有多少不同的數,這些不同的數字裡面第k大的是多少。

題解:

上來思路不是很明確,於是打個表,看一下不同的數的個數

1 -------1    1個
2 1 -------2    2個
3 1 -------3    2個
4 2 1 -------4    3個
5 2 1 -------5    3個
6 3 2 1 -------6    4個
7 3 2 1 -------7    4個
8 4 2 1 -------8    4個
9 4 3 2 1 -------9    5個
10 5 3 2 1 -------10    5個
11 5 3 2 1 -------11    5個
12 6 4 3 2 1 -------12    6個
13 6 4 3 2 1 -------13    6個
14 7 4 3 2 1 -------14    6個
15 7 5 3 2 1 -------15    6個
16 8 5 4 3 2 1 -------16    7個
17 8 5 4 3 2 1 -------17    7個
18 9 6 4 3 2 1 -------18    7個
19 9 6 4 3 2 1 -------19    7個
20 10 6 5 4 3 2 1 -------20    8個
21 10 7 5 4 3 2 1 -------21    8個
22 11 7 5 4 3 2 1 -------22    8個
23 11 7 5 4 3 2 1 -------23    8個
24 12 8 6 4 3 2 1 -------24    8個
25 12 8 6 5 4 3 2 1 -------25    9個
26 13 8 6 5 4 3 2 1 -------26    9個
27 13 9 6 5 4 3 2 1 -------27    9個
28 14 9 7 5 4 3 2 1 -------28    9個
29 14 9 7 5 4 3 2 1 -------29    9個
30 15 10 7 6 5 4 3 2 1 -------30    10個
31 15 10 7 6 5 4 3 2 1 -------31    10個
32 16 10 8 6 5 4 3 2 1 -------32    10個
33 16 11 8 6 5 4 3 2 1 -------33    10個
34 17 11 8 6 5 4 3 2 1 -------34    10個
35 17 11 8 7 5 4 3 2 1 -------35    10個
36 18 12 9 7 6 5 4 3 2 1 -------36    11個
37 18 12 9 7 6 5 4 3 2 1 -------37    11個
38 19 12 9 7 6 5 4 3 2 1 -------38    11個
39 19 13 9 7 6 5 4 3 2 1 -------39    11個
40 20 13 10 8 6 5 4 3 2 1 -------40    11個
41 20 13 10 8 6 5 4 3 2 1 -------41    11個
42 21 14 10 8 7 6 5 4 3 2 1 -------42    12個
43 21 14 10 8 7 6 5 4 3 2 1 -------43    12個
44 22 14 11 8 7 6 5 4 3 2 1 -------44    12個
45 22 15 11 9 7 6 5 4 3 2 1 -------45    12個
46 23 15 11 9 7 6 5 4 3 2 1 -------46    12個
47 23 15 11 9 7 6 5 4 3 2 1 -------47    12個
48 24 16 12 9 8 6 5 4 3 2 1 -------48    12個
49 24 16 12 9 8 7 6 5 4 3 2 1 -------49    13個
50 25 16 12 10 8 7 6 5 4 3 2 1 -------50    13個
51 25 17 12 10 8 7 6 5 4 3 2 1 -------51    13個
52 26 17 13 10 8 7 6 5 4 3 2 1 -------52    13個
53 26 17 13 10 8 7 6 5 4 3 2 1 -------53    13個
54 27 18 13 10 9 7 6 5 4 3 2 1 -------54    13個
55 27 18 13 11 9 7 6 5 4 3 2 1 -------55    13個
56 28 18 14 11 9 8 7 6 5 4 3 2 1 -------56    14個
57 28 19 14 11 9 8 7 6 5 4 3 2 1 -------57    14個
58 29 19 14 11 9 8 7 6 5 4 3 2 1 -------58    14個
59 29 19 14 11 9 8 7 6 5 4 3 2 1 -------59    14個
60 30 20 15 12 10 8 7 6 5 4 3 2 1 -------60    14個
61 30 20 15 12 10 8 7 6 5 4 3 2 1 -------61    14個
62 31 20 15 12 10 8 7 6 5 4 3 2 1 -------62    14個
63 31 21 15 12 10 9 7 6 5 4 3 2 1 -------63    14個
64 32 21 16 12 10 9 8 7 6 5 4 3 2 1 -------64    15個
65 32 21 16 13 10 9 8 7 6 5 4 3 2 1 -------65    15個
66 33 22 16 13 11 9 8 7 6 5 4 3 2 1 -------66    15個
67 33 22 16 13 11 9 8 7 6 5 4 3 2 1 -------67    15個
68 34 22 17 13 11 9 8 7 6 5 4 3 2 1 -------68    15個
69 34 23 17 13 11 9 8 7 6 5 4 3 2 1 -------69    15個
70 35 23 17 14 11 10 8 7 6 5 4 3 2 1 -------70    15個
71 35 23 17 14 11 10 8 7 6 5 4 3 2 1 -------71    15個
72 36 24 18 14 12 10 9 8 7 6 5 4 3 2 1 -------72    16個
73 36 24 18 14 12 10 9 8 7 6 5 4 3 2 1 -------73    16個
74 37 24 18 14 12 10 9 8 7 6 5 4 3 2 1 -------74    16個
75 37 25 18 15 12 10 9 8 7 6 5 4 3 2 1 -------75    16個
76 38 25 19 15 12 10 9 8 7 6 5 4 3 2 1 -------76    16個
77 38 25 19 15 12 11 9 8 7 6 5 4 3 2 1 -------77    16個
78 39 26 19 15 13 11 9 8 7 6 5 4 3 2 1 -------78    16個
79 39 26 19 15 13 11 9 8 7 6 5 4 3 2 1 -------79    16個
80 40 26 20 16 13 11 10 8 7 6 5 4 3 2 1 -------80    16個
81 40 27 20 16 13 11 10 9 8 7 6 5 4 3 2 1 -------81    17個
82 41 27 20 16 13 11 10 9 8 7 6 5 4 3 2 1 -------82    17個
83 41 27 20 16 13 11 10 9 8 7 6 5 4 3 2 1 -------83    17個
84 42 28 21 16 14 12 10 9 8 7 6 5 4 3 2 1 -------84    17個
85 42 28 21 17 14 12 10 9 8 7 6 5 4 3 2 1 -------85    17個
86 43 28 21 17 14 12 10 9 8 7 6 5 4 3 2 1 -------86    17個
87 43 29 21 17 14 12 10 9 8 7 6 5 4 3 2 1 -------87    17個
88 44 29 22 17 14 12 11 9 8 7 6 5 4 3 2 1 -------88    17個
89 44 29 22 17 14 12 11 9 8 7 6 5 4 3 2 1 -------89    17個
90 45 30 22 18 15 12 11 10 9 8 7 6 5 4 3 2 1 -------90    18個
91 45 30 22 18 15 13 11 10 9 8 7 6 5 4 3 2 1 -------91    18個
92 46 30 23 18 15 13 11 10 9 8 7 6 5 4 3 2 1 -------92    18個
93 46 31 23 18 15 13 11 10 9 8 7 6 5 4 3 2 1 -------93    18個
94 47 31 23 18 15 13 11 10 9 8 7 6 5 4 3 2 1 -------94    18個
95 47 31 23 19 15 13 11 10 9 8 7 6 5 4 3 2 1 -------95    18個
96 48 32 24 19 16 13 12 10 9 8 7 6 5 4 3 2 1 -------96    18個
97 48 32 24 19 16 13 12 10 9 8 7 6 5 4 3 2 1 -------97    18個
98 49 32 24 19 16 14 12 10 9 8 7 6 5 4 3 2 1 -------98    18個
99 49 33 24 19 16 14 12 11 9 8 7 6 5 4 3 2 1 -------99    18個
100 50 33 25 20 16 14 12 11 10 9 8 7 6 5 4 3 2 1 -------100    19個

發現在25,36,49,64,81這些點不同數的個數都會加1,然後對於開根號的值相等的一段數中

比如n=64~80,這一段數中\sqrt{n} 都是8,在每一段這樣的數中,不同的數的個數也分兩段,後一段比前一段多1,進而我發現,分界點是\sqrt{n}*(\sqrt{n}+1).對於n=64~80,前一段不同數的個數是15=2\sqrt{n}-1,後一段是16=2\sqrt{n}

設這些不同的數的個數為m,以m/2為分界線(在這裡比如64-80這一段是要看80的,如果看70的話可能不到m/2,從第5項就開始遞減了,但這是恰好對上的),如果k在前一半,那麼第k大的數就是n/k

如果k在後一半,那就是m/2到1中倒著數的第k-m/2個,即 \frac{m}{2}-(k-\frac{m}{2})+1

打表的時候可能會掉入一個坑:隊友用set存的,結果最後顯示的都是排了序的,所以沒看出規律

#include<bits/stdc++.h>
using namespace std;
#define mod 998244353
typedef long long ll;
int main()
{
//  int T;
    int T;
    scanf("%d",&T);
    ll n,k;
    while(T--)
    {
        scanf("%lld%lld",&n,&k);
        ll q=sqrt(n),m;
        if(n>=q*(q+1))
            m=2*q;
        else m=2*q-1;
        if(k<=m/2)
            printf("%lld %lld\n",m,n/k);
        else printf("%lld %lld\n",m,m-k+1);
    }
    return 0;
}

打表程式

#include<bits/stdc++.h>
using namespace std;
#define mod 998244353
typedef long long ll;
int main()
{
//   freopen("input.txt","r",stdin);
    for(int n=1; n<=100; ++n)
    {
        int pre=-1;
        int num=0;
        for(int i=1; i<=n; ++i)
        {
            if(n/i!=pre)
                cout<<n/i<<' ',num++;
            pre=n/i;
        }
        cout<<"-------"<<n<<"    "<<num<<"個"<<endl;
    }
    return 0;
}