CodeForces 121 C.Lucky Permutation(组合数学)
2017-12-30 20:34
405 查看
Description
一个排列的权为幸运数字位置上也是幸运数字,幸运数字指的是全部由4,7组成的数字,问长度为n的所有排列中字典序第k小的排列的权
Input
两个整数n,k(1≤n,k≤109)
Output
如果字典序第k小的排列不存在则输出−1,否则输出其权
Sample Input
7 4
Sample Output
1
Solution
虽然此处n很大,但是由于k不大,故字典序第k小的排列其前面的大部分数字都不变,最多后面十几个数字顺序改变,用康托展开即可得到后面乱序的十几个数字,这些数字直接暴力判断是否对答案有贡献,前面的1~x这些数字,i就在第i个位置上,所以它们对答案的贡献就是幸运数字的个数,直接枚举九位是4还是7然后得到一个幸运数字判断其是否在该区间即可
Code
一个排列的权为幸运数字位置上也是幸运数字,幸运数字指的是全部由4,7组成的数字,问长度为n的所有排列中字典序第k小的排列的权
Input
两个整数n,k(1≤n,k≤109)
Output
如果字典序第k小的排列不存在则输出−1,否则输出其权
Sample Input
7 4
Sample Output
1
Solution
虽然此处n很大,但是由于k不大,故字典序第k小的排列其前面的大部分数字都不变,最多后面十几个数字顺序改变,用康托展开即可得到后面乱序的十几个数字,这些数字直接暴力判断是否对答案有贡献,前面的1~x这些数字,i就在第i个位置上,所以它们对答案的贡献就是幸运数字的个数,直接枚举九位是4还是7然后得到一个幸运数字判断其是否在该区间即可
Code
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #include<queue> #include<map> #include<set> #include<ctime> using namespace std; typedef long long ll; typedef pair<int,int>P; const int INF=0x3f3f3f3f,maxn=22; int fact[maxn],g[maxn]; bool check(int x) { while(x) { if(x%10!=4&&x%10!=7)return 0; x/=10; } return 1; } int Solve(int n) { g[0]=1; for(int i=1;i<9;i++)g[i]=10*g[i-1]; int ans=0; for(int k=1;k<=9;k++) { int N=1<<k; for(int i=0;i<N;i++) { int temp=0; for(int j=0;j<k;j++) if(i&(1<<j))temp+=4*g[j]; else temp+=7*g[j]; if(temp<=n)ans++; } } return ans; } int main() { fact[0]=1; for(int i=1;i<=12;i++)fact[i]=i*fact[i-1]; int n,k; while(~scanf("%d%d",&n,&k)) { k--; int x=0; for(int i=12;i>=0;i--) if(k>=fact[i]) { x=i+1; break; } if(x>n)printf("-1\n"); else { int mark[maxn],a[maxn]; memset(mark,0,sizeof(mark)); for(int i=x-1;i>=0;i--) { int t=k/fact[i]; k%=fact[i]; for(int j=0;j<x;j++) if(!mark[j]) { t--; if(t<0) { mark[j]=1; a[x-1-i]=j; break; } } } int ans=Solve(n-x); for(int i=0;i<x;i++) if(check(n-x+1+i)&&check(n-x+1+a[i]))ans++; printf("%d\n",ans); } } return 0; }
相关文章推荐
- Codeforces 932 E. Team Work(组合数学)
- codeforces 938E MaxHistory 组合数学
- Codeforces 37D Lesson Timetable - 组合数学 - 动态规划
- CodeForces 630H- Benches【组合数学】
- Codeforces 666C C. Codeword 组合数学+DP
- codeforces 559C Gerald and Giant Chess(组合数学)
- 【1】【组合数学】CodeForces 650A Watchmen
- codeforces 156C Cipher 组合数学 字符串dp
- CodeForces 340 C.Tourist Problem(组合数学)
- Codeforces 559C Gerald and Giant Chess 组合数学 DP
- Codeforces 51E Pentagon - 组合数学 - 动态规划
- 【CodeForces】115D Unambiguous Arithmetic Expression 组合数学
- Codeforces 886E (Codeforces Round #445) Maximum Element 组合数学+DP
- Codeforces 451D - Count Good Substrings(组合数学)
- CodeForces 478 B.Random Teams(组合数学)
- CodeForces 575 H.Bots(组合数学)
- CodeForces 768 F.Barrels and boxes(组合数学)
- codeforces 869C The Intriguing Obsession 组合数学
- codeforces 914C. Travelling Salesman and Special Numbers (DP + 组合数学)
- Codeforces 40E Number Table - 组合数学