链接:https://www.nowcoder.com/acm/contest/70/D

题目:
定义一个数字为幸运数字当且仅当它的所有数位都是4或者7。
比如说,47、744、4都是幸运数字而5、17、467都不是。
现在想知道在1...n的第k小的排列中,有多少个幸运数字所在的位置的序号也是幸运数字。

输入描述:

  1. 第一行两个整数nk
    1 <= nk <= 1000,000,000

输出描述:

  1. 一个数字表示答案。
    如果n没有k个排列,输出-1

输入例子:
  1. 7 4
输出例子:
  1. 1

-->

示例1

输入

  1. 7 4

输出

  1. 1

说明

  1. 1 2 3 4 6 7 5
示例2

输入

  1. 4 7

输出

  1. 1

说明

  1. 2 1 3 4

思路:13以内暴力,13以后的可以保证前面N-13为的排列是1,2....N-13,然后暴力后面13位。

(应该可以统一起来)。

当时由于一些细节问题,wa了很多次。导致最后面那个水题没有搞定。

  1. #include<cmath>
  2. #include<vector>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<cstdlib>
  6. #include<iostream>
  7. #include<algorithm>
  8. using namespace std;
  9. #define ll long long
  10. const int inf=;
  11. ll p[];int num[],ans;
  12. int vis[],t1,t2,cnt,tot=,N,K;
  13. ll a[],cnt2;
  14. void dfs(ll sum)
  15. {
  16. a[++cnt2]=sum;
  17. if(sum>inf) return ;
  18. dfs(sum*+);
  19. dfs(sum*+);
  20. }
  21. void Work(int n,int m)
  22. {
  23. t2=m-;t1=;
  24. memset(vis,,sizeof(vis));
  25. int k=;
  26. for(int i=;i<=n;i++){
  27. t1=t2/p[n-i];
  28. t2=t2%p[n-i];
  29. cnt=;
  30. for(int j=k;j<=n;j++)
  31. if(!vis[j]){
  32. cnt++;
  33. if(cnt==t1+){
  34. vis[j]=;
  35. num[++tot]=j;
  36. break;
  37. }
  38. }
  39. }
  40. for(int i=;i<=n;i++){
  41. bool Flag1=false,Flag2=false;int pos;
  42. pos=lower_bound(a+,a+cnt2+,num[i])-a;
  43. if(num[i]==a[pos]) Flag1=true;
  44. pos=lower_bound(a+,a+cnt2+,i)-a;
  45. if(i==a[pos]) Flag2=true;
  46. if(Flag1&&Flag2) ans++;
  47. }
  48. }
  49. void Work2(int n,int m)
  50. {
  51. t2=m-;t1=;
  52. memset(vis,,sizeof(vis));
  53. int k=;
  54. for(int i=;i<=n;i++){
  55. t1=t2/p[n-i];
  56. t2=t2%p[n-i];
  57. cnt=;
  58. for(int j=k;j<=n;j++)
  59. if(!vis[j]){
  60. cnt++;
  61. if(cnt==t1+){
  62. vis[j]=;
  63. num[++tot]=j;
  64. break;
  65. }
  66. }
  67. }
  68. //for(int i=1;i<=13;i++) num[i]+=N-13;
  69. //for(int i=1;i<=n;i++) cout<<N-13+i<<" "<<num[i]+N-13<<endl;
  70. for(int i=;i<=;i++){
  71. bool Flag1=false,Flag2=false;int pos;
  72. pos=lower_bound(a+,a+cnt2+,num[i]+N-)-a;
  73. if(num[i]+N-==a[pos]) Flag1=true;
  74. pos=lower_bound(a+,a+cnt2+,i+N-)-a;
  75. if(i+N-==a[pos]) Flag2=true;
  76. if(Flag1&&Flag2) ans++;
  77. }
  78. }
  79. int main()
  80. {
  81. dfs();
  82. sort(a+,a+cnt2+);
  83. p[]=; p[]=; for(int i=;i<=;i++) p[i]=p[i-]*i;
  84. scanf("%d%d",&N,&K);
  85. if(N<=){
  86. if(K>p[N]) printf("-1\n");
  87. else{
  88. Work(N,K);
  89. printf("%d\n",ans);
  90. }
  91. }
  92. else {
  93. for(int i=;i<=cnt2;i++) if(a[i]<=N-) ans++;
  94. Work2(,K);
  95. printf("%d\n",ans);
  96. }
  97. return ;
  98. }

F题:8个方向分别排序即可,一共10种情况,比赛的时候写到8就没时间了,可能也就两三分钟的事情,GG。

  1. #include<cstdio>
  2. #include<vector>
  3. #include<cstdlib>
  4. #include<iostream>
  5. #include<algorithm>
  6. using namespace std;
  7. const int maxn=;
  8. int ans[maxn+],num[],cnt,M,N;
  9. struct in
  10. {
  11. int x; int y; int op; int id;
  12. in(){}
  13. in(int xx,int yy,int oo,int ii):x(xx),y(yy),op(oo),id(ii){}
  14. };
  15. in xx[maxn+];
  16. vector<in>s[maxn+];
  17. bool cmp1(in a,in b){
  18. return a.op>b.op;
  19. }
  20. bool cmp2(in a,in b){
  21. return a.op<b.op;
  22. }
  23. void solve1()
  24. {
  25. for(int i=;i<=M;i++) s[i].clear();
  26. for(int i=;i<=N;i++) {
  27. s[xx[i].x].push_back(in(xx[i].x,xx[i].y,xx[i].y,xx[i].id));
  28. }
  29. for(int i=;i<=M;i++) {
  30. sort(s[i].begin(),s[i].end(),cmp1);
  31. for(int j=;j<s[i].size();j++){
  32. ans[s[i][j].id]++;
  33. }
  34. }
  35. }
  36. void solve2()
  37. {
  38. for(int i=;i<=M;i++) s[i].clear();
  39. for(int i=;i<=N;i++) {
  40. s[xx[i].x].push_back(in(xx[i].x,xx[i].y,xx[i].y,xx[i].id));
  41. }
  42. for(int i=;i<=M;i++) {
  43. sort(s[i].begin(),s[i].end(),cmp2);
  44. for(int j=;j<s[i].size();j++){
  45. ans[s[i][j].id]++;
  46. }
  47. }
  48. }
  49. void solve3()
  50. {
  51. for(int i=;i<=M;i++) s[i].clear();
  52. for(int i=;i<=N;i++) {
  53. s[xx[i].y].push_back(in(xx[i].x,xx[i].y,xx[i].x,xx[i].id));
  54. }
  55. for(int i=;i<=M;i++) {
  56. sort(s[i].begin(),s[i].end(),cmp1);
  57. for(int j=;j<s[i].size();j++){
  58. ans[s[i][j].id]++;
  59. }
  60. }
  61. }
  62. void solve4()
  63. {
  64. for(int i=;i<=M;i++) s[i].clear();
  65. for(int i=;i<=N;i++) {
  66. s[xx[i].y].push_back(in(xx[i].x,xx[i].y,xx[i].x,xx[i].id));
  67. }
  68. for(int i=;i<=M;i++) {
  69. sort(s[i].begin(),s[i].end(),cmp2);
  70. for(int j=;j<s[i].size();j++){
  71. ans[s[i][j].id]++;
  72. }
  73. }
  74. }
  75. void solve5()
  76. {
  77. for(int i=;i<=M;i++) s[i].clear();
  78. for(int i=;i<=N;i++) {
  79. s[xx[i].y+xx[i].x].push_back(in(xx[i].x,xx[i].y,xx[i].x,xx[i].id));
  80. }
  81. for(int i=;i<=M;i++) {
  82. sort(s[i].begin(),s[i].end(),cmp1);
  83. for(int j=;j<s[i].size();j++){
  84. ans[s[i][j].id]++;
  85. }
  86. }
  87. }
  88. void solve6()
  89. {
  90. for(int i=;i<=M;i++) s[i].clear();
  91. for(int i=;i<=N;i++) {
  92. s[xx[i].y+xx[i].x].push_back(in(xx[i].x,xx[i].y,xx[i].x,xx[i].id));
  93. }
  94. for(int i=;i<=M;i++) {
  95. sort(s[i].begin(),s[i].end(),cmp2);
  96. for(int j=;j<s[i].size();j++){
  97. ans[s[i][j].id]++;
  98. }
  99. }
  100. }
  101. void solve7()
  102. {
  103. for(int i=;i<=M;i++) s[i].clear();
  104. for(int i=;i<=N;i++) {
  105. if(xx[i].y>=xx[i].x) s[xx[i].y-xx[i].x].push_back(in(xx[i].x,xx[i].y,xx[i].x,xx[i].id));
  106. }
  107. for(int i=;i<=M;i++) {
  108. sort(s[i].begin(),s[i].end(),cmp1);
  109. for(int j=;j<s[i].size();j++){
  110. ans[s[i][j].id]++;
  111. }
  112. }
  113. }
  114. void solve8()
  115. {
  116. for(int i=;i<=M;i++) s[i].clear();
  117. for(int i=;i<=N;i++) {
  118. if(xx[i].y>=xx[i].x) s[xx[i].y-xx[i].x].push_back(in(xx[i].x,xx[i].y,xx[i].x,xx[i].id));
  119. }
  120. for(int i=;i<=M;i++) {
  121. sort(s[i].begin(),s[i].end(),cmp2);
  122. for(int j=;j<s[i].size();j++){
  123. ans[s[i][j].id]++;
  124. }
  125. }
  126. }
  127. void solve9()
  128. {
  129. for(int i=;i<=M;i++) s[i].clear();
  130. for(int i=;i<=N;i++) {
  131. if(xx[i].y<xx[i].x) s[xx[i].x-xx[i].y].push_back(in(xx[i].x,xx[i].y,xx[i].x,xx[i].id));
  132. }
  133. for(int i=;i<=M;i++) {
  134. sort(s[i].begin(),s[i].end(),cmp1);
  135. for(int j=;j<s[i].size();j++){
  136. ans[s[i][j].id]++;
  137. }
  138. }
  139. }
  140. void solve10()
  141. {
  142. for(int i=;i<=M;i++) s[i].clear();
  143. for(int i=;i<=N;i++) {
  144. if(xx[i].y<xx[i].x) s[xx[i].x-xx[i].y].push_back(in(xx[i].x,xx[i].y,xx[i].x,xx[i].id));
  145. }
  146. for(int i=;i<=M;i++) {
  147. sort(s[i].begin(),s[i].end(),cmp2);
  148. for(int j=;j<s[i].size();j++){
  149. ans[s[i][j].id]++;
  150. }
  151. }
  152. }
  153. int main()
  154. {
  155. scanf("%d%d",&M,&N);
  156. M=M*+;
  157. for(int i=;i<=N;i++){
  158. xx[i].id=i;
  159. scanf("%d%d",&xx[i].x,&xx[i].y);
  160. }
  161. solve1();
  162. solve2();
  163. solve3();
  164. solve4();
  165. solve5();
  166. solve6();
  167. solve7();
  168. solve8();
  169. solve9();
  170. solve10();
  171. for(int i=;i<=N;i++) num[ans[i]]++;
  172. for(int i=;i<;i++) cout<<num[i]<<" ";
  173. cout<<num[]<<endl;
  174. return ;
  175. }

牛客练习赛13D:幸运数字Ⅳ(康托展开) F:关键字排序的更多相关文章

  1. 牛客练习赛13D 幸运数字4

    题目链接:https://ac.nowcoder.com/acm/contest/70/D 题目大意: 略 分析: 注意到12! < 10^9 < 13!,于是当n > 13时,第k ...

  2. 牛客练习赛13B 幸运数字2

    题目链接:https://ac.nowcoder.com/acm/contest/70/B 题目大意: 略 分析: 先DFS求出所有幸运数,然后暴力即可 代码如下: #pragma GCC optim ...

  3. 牛客练习赛13D

    定义一个数字为幸运数字当且仅当它的所有数位都是4或者7.比如说,47.744.4都是幸运数字而5.17.467都不是.现在想知道在1...n的第k小的排列(permutation,https://en ...

  4. 牛客提高D2t2 幸运数字考试

    分析 预处理出所有合法数字 然后直接lower_bound查询即可 代码 #include<iostream> #include<cstdio> #include<cst ...

  5. 牛客练习赛48 C 小w的糖果 (数学,多项式,差分)

    牛客练习赛48 C 小w的糖果 (数学,多项式) 链接:https://ac.nowcoder.com/acm/contest/923/C来源:牛客网 题目描述 小w和他的两位队友teito.toki ...

  6. 牛客练习赛48 A· 小w的a+b问题 (贪心,构造,二进制)

    牛客练习赛48 A· 小w的a+b问题 链接:https://ac.nowcoder.com/acm/contest/923/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C ...

  7. 牛客练习赛53 D 德育分博弈政治课 (思维建图,最大流)

    牛客练习赛53 D德育分博弈政治课 链接:https://ac.nowcoder.com/acm/contest/1114/D来源:牛客网 题目描述 德育分学长最近玩起了骰子.他玩的骰子不同,他的骰子 ...

  8. 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D

    目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...

  9. 牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 逻辑,博弈 B

    牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 https://ac.nowcoder.com/acm/contest/218/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...

随机推荐

  1. mapStruct笔记

    背景 mapStruct 是一个方便对象转换的工具,类似的工具还有 Dozer, BeanUtils. 实现 mapStruct的核心是在编译期生成基于转换规则的 Impl 文件,运行时直接调用 Im ...

  2. BOOST asio 例程daytime不使用库编译方法

    在不使用lib库编译daytime client程序时,按照<Boost程序库完全开发指南>添加的定义 #define BOOST_REGEX_NO_LIB#define BOOST_DA ...

  3. ***js常用方法汇总(源自实际中的项目)

    Q: 400-819-0717转8888,取后四位分机号 A: 方法一: alert("abcdefg".slice(-4));方法二:var str= "abcdefg ...

  4. codeforces 1041 d 二分

    题意转化:有一些区间,要求选一些连续的区间.两两区间间隔的和要求小于H.要求区间的长度和尽可能长. 二分区间长度的和,check一下就行 #include <bits/stdc++.h> ...

  5. Maven安装和手动安装jar到仓库

    1. 安装Maven 1.下载mvn到本地,解压. 2.新建系统变量MAVEN_HOME,值指向安装目录如D:\apache-maven-3.3.9 3.path变量中增加:%MAVEN_HOME%\ ...

  6. weblogic负载分发

    博客分类: weblogic 负载均衡的实现方式有很多种,这里只介绍三种相对来说成本较低的方案(维护成本以及费用成本)weblogic自带的proxy.apache.nginx 1.weblogic自 ...

  7. ArcSDE数据库连接(直连、服务连)与GT_Geometry存

    http://ziliao1.com/Article/Show/48126AB1A8F563D35E3D0345677C906B 众说周知,ArcSDE空间数据库引擎提供了两种连接数据库的方式.一是服 ...

  8. FPGA第一篇:SRAM工作原理

    一.SRAM概述 SRAM主要用于二级快速缓存(Level2 C ache). 它利用晶体管来存储数据.与DRAM相比,SRAM的速度快,但在同样面积中SRAM的容量要比其它类型的内存小. 大部分FP ...

  9. 基于UDP的通讯

    XX:那飘过的100~_~{2014/10/03 10:57} UDP是一种面向非连接SOCK_DGRAM,提供无连接服务.数据包以独立包形式发送,不提供无措保证,数据能够丢失或反复. UDP的Ser ...

  10. python的线程thread笔记

    python的线程是用thread和threading来实现的.其中利用threading会更好,因为thread没有线程保护,当主线程退出了之后,子线程也会被强行退出.threading支持守护线程 ...