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

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

输入描述:

第一行两个整数n,k。
1 <= n,k <= 1000,000,000

输出描述:

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

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

-->

示例1

输入

7 4

输出

1

说明

1 2 3 4 6 7 5
示例2

输入

4 7

输出

1

说明

2 1 3 4

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

(应该可以统一起来)。

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

#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
const int inf=;
ll p[];int num[],ans;
int vis[],t1,t2,cnt,tot=,N,K;
ll a[],cnt2;
void dfs(ll sum)
{
a[++cnt2]=sum;
if(sum>inf) return ;
dfs(sum*+);
dfs(sum*+);
}
void Work(int n,int m)
{
t2=m-;t1=;
memset(vis,,sizeof(vis));
int k=;
for(int i=;i<=n;i++){
t1=t2/p[n-i];
t2=t2%p[n-i];
cnt=;
for(int j=k;j<=n;j++)
if(!vis[j]){
cnt++;
if(cnt==t1+){
vis[j]=;
num[++tot]=j;
break;
}
}
}
for(int i=;i<=n;i++){
bool Flag1=false,Flag2=false;int pos;
pos=lower_bound(a+,a+cnt2+,num[i])-a;
if(num[i]==a[pos]) Flag1=true;
pos=lower_bound(a+,a+cnt2+,i)-a;
if(i==a[pos]) Flag2=true;
if(Flag1&&Flag2) ans++;
}
}
void Work2(int n,int m)
{
t2=m-;t1=;
memset(vis,,sizeof(vis));
int k=;
for(int i=;i<=n;i++){
t1=t2/p[n-i];
t2=t2%p[n-i];
cnt=;
for(int j=k;j<=n;j++)
if(!vis[j]){
cnt++;
if(cnt==t1+){
vis[j]=;
num[++tot]=j;
break;
}
}
}
//for(int i=1;i<=13;i++) num[i]+=N-13;
//for(int i=1;i<=n;i++) cout<<N-13+i<<" "<<num[i]+N-13<<endl;
for(int i=;i<=;i++){
bool Flag1=false,Flag2=false;int pos;
pos=lower_bound(a+,a+cnt2+,num[i]+N-)-a;
if(num[i]+N-==a[pos]) Flag1=true;
pos=lower_bound(a+,a+cnt2+,i+N-)-a;
if(i+N-==a[pos]) Flag2=true;
if(Flag1&&Flag2) ans++;
}
}
int main()
{
dfs();
sort(a+,a+cnt2+);
p[]=; p[]=; for(int i=;i<=;i++) p[i]=p[i-]*i;
scanf("%d%d",&N,&K);
if(N<=){
if(K>p[N]) printf("-1\n");
else{
Work(N,K);
printf("%d\n",ans);
}
}
else {
for(int i=;i<=cnt2;i++) if(a[i]<=N-) ans++;
Work2(,K);
printf("%d\n",ans);
}
return ;
}

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

#include<cstdio>
#include<vector>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=;
int ans[maxn+],num[],cnt,M,N;
struct in
{
int x; int y; int op; int id;
in(){}
in(int xx,int yy,int oo,int ii):x(xx),y(yy),op(oo),id(ii){}
};
in xx[maxn+];
vector<in>s[maxn+];
bool cmp1(in a,in b){
return a.op>b.op;
}
bool cmp2(in a,in b){
return a.op<b.op;
}
void solve1()
{
for(int i=;i<=M;i++) s[i].clear();
for(int i=;i<=N;i++) {
s[xx[i].x].push_back(in(xx[i].x,xx[i].y,xx[i].y,xx[i].id));
}
for(int i=;i<=M;i++) {
sort(s[i].begin(),s[i].end(),cmp1);
for(int j=;j<s[i].size();j++){
ans[s[i][j].id]++;
}
}
}
void solve2()
{
for(int i=;i<=M;i++) s[i].clear();
for(int i=;i<=N;i++) {
s[xx[i].x].push_back(in(xx[i].x,xx[i].y,xx[i].y,xx[i].id));
}
for(int i=;i<=M;i++) {
sort(s[i].begin(),s[i].end(),cmp2);
for(int j=;j<s[i].size();j++){
ans[s[i][j].id]++;
}
}
}
void solve3()
{
for(int i=;i<=M;i++) s[i].clear();
for(int i=;i<=N;i++) {
s[xx[i].y].push_back(in(xx[i].x,xx[i].y,xx[i].x,xx[i].id));
}
for(int i=;i<=M;i++) {
sort(s[i].begin(),s[i].end(),cmp1);
for(int j=;j<s[i].size();j++){
ans[s[i][j].id]++;
}
}
}
void solve4()
{
for(int i=;i<=M;i++) s[i].clear();
for(int i=;i<=N;i++) {
s[xx[i].y].push_back(in(xx[i].x,xx[i].y,xx[i].x,xx[i].id));
}
for(int i=;i<=M;i++) {
sort(s[i].begin(),s[i].end(),cmp2);
for(int j=;j<s[i].size();j++){
ans[s[i][j].id]++;
}
}
}
void solve5()
{
for(int i=;i<=M;i++) s[i].clear();
for(int i=;i<=N;i++) {
s[xx[i].y+xx[i].x].push_back(in(xx[i].x,xx[i].y,xx[i].x,xx[i].id));
}
for(int i=;i<=M;i++) {
sort(s[i].begin(),s[i].end(),cmp1);
for(int j=;j<s[i].size();j++){
ans[s[i][j].id]++;
}
}
}
void solve6()
{
for(int i=;i<=M;i++) s[i].clear();
for(int i=;i<=N;i++) {
s[xx[i].y+xx[i].x].push_back(in(xx[i].x,xx[i].y,xx[i].x,xx[i].id));
}
for(int i=;i<=M;i++) {
sort(s[i].begin(),s[i].end(),cmp2);
for(int j=;j<s[i].size();j++){
ans[s[i][j].id]++;
}
}
}
void solve7()
{
for(int i=;i<=M;i++) s[i].clear();
for(int i=;i<=N;i++) {
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));
}
for(int i=;i<=M;i++) {
sort(s[i].begin(),s[i].end(),cmp1);
for(int j=;j<s[i].size();j++){
ans[s[i][j].id]++;
}
}
}
void solve8()
{
for(int i=;i<=M;i++) s[i].clear();
for(int i=;i<=N;i++) {
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));
}
for(int i=;i<=M;i++) {
sort(s[i].begin(),s[i].end(),cmp2);
for(int j=;j<s[i].size();j++){
ans[s[i][j].id]++;
}
}
}
void solve9()
{
for(int i=;i<=M;i++) s[i].clear();
for(int i=;i<=N;i++) {
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));
}
for(int i=;i<=M;i++) {
sort(s[i].begin(),s[i].end(),cmp1);
for(int j=;j<s[i].size();j++){
ans[s[i][j].id]++;
}
}
}
void solve10()
{
for(int i=;i<=M;i++) s[i].clear();
for(int i=;i<=N;i++) {
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));
}
for(int i=;i<=M;i++) {
sort(s[i].begin(),s[i].end(),cmp2);
for(int j=;j<s[i].size();j++){
ans[s[i][j].id]++;
}
}
}
int main()
{
scanf("%d%d",&M,&N);
M=M*+;
for(int i=;i<=N;i++){
xx[i].id=i;
scanf("%d%d",&xx[i].x,&xx[i].y);
}
solve1();
solve2();
solve3();
solve4();
solve5();
solve6();
solve7();
solve8();
solve9();
solve10();
for(int i=;i<=N;i++) num[ans[i]]++;
for(int i=;i<;i++) cout<<num[i]<<" ";
cout<<num[]<<endl;
return ;
}

牛客练习赛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. HDU-3746Cyclic Nacklace,next数组简单应用。

    Cyclic Nacklace 节省篇幅不粘题面了... 看懂题后脑袋里略过KMP,学过但没怎么用过,又直接跳下一题了.. 题意:给定一个字符串,可以从两边加上一些字符使其有循环节..求最少需要加多少 ...

  2. 【2017多校训练2+计算几何+板】HDU 6055 Regular polygon

    http://acm.hdu.edu.cn/showproblem.php?pid=6055 [题意] 给定n个格点,问有多少个正多边形 [思路] 因为是格点,只可能是正方形 枚举正方形的对角线,因为 ...

  3. Python的另一种开发环境--Anaconda中的Spyder

    本文作者LucyGill,转载请注明出处(虽然我觉得并不会有人转载). 刚开始学Python的时候,我用的是其自带的idle(安装Python后,在开始菜单里可以找到),后来发现在eclipse中设置 ...

  4. apache + DSO -动态共享对象(DSO)

    http://www.jinbuguo.com/apache/menu22/dso.html

  5. Access数据库密码破解 C#

    private string GetPassword(string file) { // 未加密的文件0x42开始至0x61之前的每间隔一字节的数值 byte[] baseByte = { 0xbe, ...

  6. P3366 最小生成树【模板】 洛谷

    https://www.luogu.org/problem/show?pid=3366 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包 ...

  7. P1427 小鱼的数字游戏 洛谷

    https://www.luogu.org/problem/show?pid=1427 题目描述 小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字(长度不一定,以0结束,最多不超过100个,数字 ...

  8. Java模拟斗地主(实现大小排序)

    import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.Li ...

  9. 纠结的链接——ln、ln -s、fs.symlink、require

    纠结的链接--ln.ln -s.fs.symlink.require 提交 我的留言 加载中 已留言 inode 我们首先来看看 linux 系统里面的一个重要概念:inode. 我们知道,文件存储在 ...

  10. Error Code: 2006 - MySQL 鏈嶅姟鍣ㄥ凡绂荤嚎

    将sql文件导入到mysql时候,就一直报这个错误. 我试过网上各种方法都行不通. 最后将以下一句运行了一下就能够了,并且没有重新启动mysql. SET GLOBAL max_allowed_pac ...