牛客國慶集訓派對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,這一段數中 都是8,在每一段這樣的數中,不同的數的個數也分兩段,後一段比前一段多1,進而我發現,分界點是.對於n=64~80,前一段不同數的個數是15=,後一段是16=
設這些不同的數的個數為m,以m/2為分界線(在這裡比如64-80這一段是要看80的,如果看70的話可能不到m/2,從第5項就開始遞減了,但這是恰好對上的),如果k在前一半,那麼第k大的數就是n/k
如果k在後一半,那就是m/2到1中倒著數的第k-m/2個,即
打表的時候可能會掉入一個坑:隊友用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; }