lightoj1060(求字符串第k大排列)组合数学

题意:求给定字符串(有重复字符)第k大排列。


解法:先判断字符串的所有排列是否够k个。然后从左向右每一位每一位确定。简单的组合数学。


代码:

/****************************************************
* author:xiefubao
*******************************************************/
#pragma comment(linker, "/STACK:102400000,102400000")
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

#define eps 1e-8
typedef long long LL;



char s[30];
int per;
int len=0;
LL fac[21];
struct point
{
    char c;
    int x;
} points[100];
int tot=0;
void init()
{
    fac[0]=1;
    for(LL i=1; i<=20; i++)
        fac[i]=fac[i-1]*i;
}
LL cal()
{
    LL tool=1;
    int t=0;
    for(int i=0; i<=tot; i++)
        t+=points[i].x,tool*=fac[points[i].x];
    return fac[t]/tool;
}
void solve()
{
    if(cal()=per)
            {
                putchar(points[j].c);
                per-=tool-now;
                break;
            }
            points[j].x++;
        }
        if(points[j].x==0)
        {
            for(int k=j; k>t;
    int kk=1;
    init();
    while(t--)
    {
        tot=0;
        scanf("%s%d",s,&per);
        len=strlen(s);
        sort(s,s+len);
        points[tot].c=s[0];
        points[tot].x=1;
        for(int i=1; i



你可能感兴趣的:(组合数学)