天天看点

牛客国庆集训派对Day5——L 数论之神(找规律/数论)

题目链接:https://www.nowcoder.com/acm/contest/205/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,这一段数中

牛客国庆集训派对Day5——L 数论之神(找规律/数论)
 都是8,在每一段这样的数中,不同的数的个数也分两段,后一段比前一段多1,进而我发现,分界点是
牛客国庆集训派对Day5——L 数论之神(找规律/数论)
.对于n=64~80,前一段不同数的个数是15=
牛客国庆集训派对Day5——L 数论之神(找规律/数论)
,后一段是16=
牛客国庆集训派对Day5——L 数论之神(找规律/数论)

设这些不同的数的个数为m,以m/2为分界线(在这里比如64-80这一段是要看80的,如果看70的话可能不到m/2,从第5项就开始递减了,但这是恰好对上的),如果k在前一半,那么第k大的数就是n/k

如果k在后一半,那就是m/2到1中倒着数的第k-m/2个,即 

牛客国庆集训派对Day5——L 数论之神(找规律/数论)
打表的时候可能会掉入一个坑:队友用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;
}