码迷,mamicode.com
首页 > 其他好文 > 详细

UVa 1262 - Password(组合数)

时间:2015-08-30 17:41:43      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:uva   组合数   

给出两个6*5矩阵,有一个5位的密码,密码的第i位必须在两个矩阵的第i列都出现过,问输出字典序第k大的满足条件的密码,无解输出“NO”。
预处理出每一位满足条件的字母,然后计算后几位密码可行的种数。对k进行判断后输出,具体细节见代码。

#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
char s[2][7][6];
bool has[2][6][27];
vector<char> ok[5];
int main(){
    int t;scanf("%d",&t);
    while(t--){
        fill(ok,ok+5,vector<char>());
        memset(has,0,sizeof has);
        int k;scanf("%d",&k);
        for(int i=0;i<2;++i)
            for(int j=0;j<6;++j)
                scanf("%s",s[i][j]);
        for(int i=0;i<5;++i)
            for(int j=0;j<6;++j){
                has[0][i][s[0][j][i]-‘A‘]=true;
                has[1][i][s[1][j][i]-‘A‘]=true;
            }
        for(int i=0;i<5;++i)
            for(int j=0;j<26;++j)
                if(has[0][i][j]&&has[1][i][j])
                    ok[i].push_back(j+‘A‘);
        int a[6];a[5]=1;
        for(int i=4;i>=0;--i) a[i]=a[i+1]*int(ok[i].size());
        if(k>a[0]){puts("NO");continue;}
        --k;
        for(int i=0;i<5;++i){
            putchar(ok[i][k/a[i+1]]);
            k%=a[i+1];
        }
        putchar(‘\n‘);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

UVa 1262 - Password(组合数)

标签:uva   组合数   

原文地址:http://blog.csdn.net/wcr1996/article/details/48105675

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!