UPC-アクセス装置(逆カントール拡張可能)

学習は、上流を漕ぎのようなものです

UPC-アクセス装置(逆カントール拡張可能)

展開カントール私は私のポイントを指して←

Nに1を取るすべての可能なNビット番号の昇順に、各番号を重複しないからなる、N個の連続番号(1≤N≤9)でした。とき番号入力M、N、対応する番号をプリントアウト可能なビット数。例えば、n = 3の場合は、すべての3桁で構成することができる。ここに画像を挿入説明したがって、入力数M = 2、出力132。

エントリー

それは2つの数字、すなわち、N(1≤N≤9)とM(1≤M≤362880)整数正の整数正を含みます。

輸出

唯一のライン、即ち、入力に対応する数NとMビット。

サンプル入力

3 2

サンプル出力

132

道路を取るときのこの質問、私は突然、2ヶ月前に考えは突然と呼ばれるアルゴリズムを見
キャンターキャンターアルゴリズムを。配列は、以下の降順になさことを意味し、完全なアレイCantorのアルゴリズムは、次いで、カンターこれにより得られたアルゴリズムは、いくつかの最初のものです例えば、元の配列は、第2の132の最初のターム123 123であり、等。
そして、あなたは正確に反対している、[OK]を、我々は逆の操作に基づくアルゴリズムカントール質問のこの場所と意味があります。まず、いくつかの正の操作を行います。

展開カントール

カントールの拡張は、次の
言葉の束として記述
まず、最初から順以来1、第1を追加します。
あなたは、このような12345、所定の障害として、列の数を定義します。
これは、いくつかの最初のものであるか53412、。
私たちは、彼はまだ数が自分の数より少ないの背後にある、すべてのデジタル数字の現在のステータスとしてNを定義し、そのようなバックとして、その後、何の数字の1が存在しないので、0です。なお、一旦除去A
5 4このようにNの背後。1 = 4、そう1234プロ配列が存在すること。
1および3がN 2であり、2つ有する2 = 2は、そう124を残しています。そのようなN 3 = 2、N 4 = 0、N 5 = 0。
だから、拡張を使用した後
a n s = i = 1 n N i ( n i ) ! + 1 ANS = \ sum_ {i = 1} ^ {n}はN_ {I} *(NI)!+ 1
4 4 ! + 2 3 ! + 2 2 ! + 0 1 ! + 0 0 ! + 1 = 113 4 * 4!+ 2 * 3!+ 2 * 2!+ 0 * 1!+ 0 * 0!+ 1 = 113
利用可能ANS 113で
ここに画像を挿入説明
、その後
カントールが拡大逆遊び方これ?
聖歌と対戦します。
階乗に加えて失われることが新鮮であることがある
ことが初めて肯定マイナス1の逆第1プラス1であるため
、その後
= 112 113-1。
OK夢の原因で開始します。
また、5つのシリーズを置く
シーケンスを12345
最初の112÷4と!= 4 ... 16は
、それらが全体のシーケンス番号であるよりも小さいこと、次いで4 + 1の数が4である
数5が第である
に配列1234
そしてその後、16÷3と!= 2 ... 4
ので、この数は2 + 1の数であるように、2つの彼らが持っているよりも小さい内部の全配列ことが
第3の数が3である
配列になります124
次いで4÷2と!= 2 ... 0
ので、その2よりも小さいがある全配列が第2の数は、+ 1の数であることを
第3の数が4である
配列になります12
そして、0÷1!= 0 ... 0
ので、その数は、その後数0 + 1が0であるよりも少ないがあるシーケンス全体その
番号1が最初にされている
シーケンスになります2
だから、最終的には53412となり

したがって、この問題は味の中にあります!

ACまでの時間

#include<iostream>
#include<algorithm>
#include<string.h>
#include<map>
#include <stack>
#include<string>
#include<math.h>
#include<stdio.h>
#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
const ll ll_inf=9223372036854775807;
const int int_inf=2147483647;
const short short_inf=32767;
const char char_inf=127;
inline ll read() {
	ll c=getchar(),Nig=1,x=0;
	while(!isdigit(c)&&c!='-')c=getchar();
	if(c=='-')Nig=-1,c=getchar();
	while(isdigit(c))x=((x<<1)+(x<<3))+(c^'0'),c=getchar();
	return Nig*x;
}
#define read read()
ll j[]= {0,1,2,6,24,120,720,5040,40320,362880,3628800};
ll save[]= {1,2,3,4,5,6,7,8,9};
int main() {
	ll n,m;
	cin>>n>>m;
	ll t=m-1;
	for(ll i=n-1; i>=1; i--) {
		ll temp=t/j[i]+1;
		for(ll j=0; j<n; j++) {
			if(save[j]==-1)continue;
			temp--;
			if(!temp) {
				printf("%lld",save[j]);
				save[j]=-1;
				break;
			}
		}
		t%=j[i];
	}
	for(int i=0; i<n; i++)
		if(save[i]!=-1) printf("%lld",save[i]);
	return 0;
}

それがより便利になるように、フロントには、以下の階乗コンテンツを格納します。
より良い消費DFSの比率を理解するための侯Kangtuo式

バイ・ホイール月

ボートのための苦いトラックの道路グラウンド、無限の学習があります。
公開された32元の記事 ウォン称賛12 ビュー1189

おすすめ

転載: blog.csdn.net/qq_35339563/article/details/104270075