cf121C. Lucky Permutation(康托展開)

来源:https://www.cnblogs.com/zwfymqz/archive/2019/01/05/10226449.html
-Advertisement-
Play Games

題意 "題目鏈接" Sol 由於階乘的數量增長非常迅速,而$k$又非常小,那麼顯然最後的序列只有最後幾位會發生改變。 前面的位置都是$i = a[i]$。那麼前面的可以直接數位dp/爆搜,後面的部分是經典問題,可以用逆康托展開計算。 cpp include define Pair pair defi ...


題意

題目鏈接

Sol

由於階乘的數量增長非常迅速,而\(k\)又非常小,那麼顯然最後的序列只有最後幾位會發生改變。

前面的位置都是\(i = a[i]\)。那麼前面的可以直接數位dp/爆搜,後面的部分是經典問題,可以用逆康托展開計算。

#include<bits/stdc++.h> 
#define Pair pair<int, int>
#define MP(x, y) make_pair(x, y)
#define fi first
#define se second
#define int long long 
#define LL long long 
#define Fin(x) {freopen(#x".in","r",stdin);}
#define Fout(x) {freopen(#x".out","w",stdout);}
using namespace std;
const int MAXN = 1e6 + 1, mod = 1e9 + 7, INF = 1e9 + 10;
const double eps = 1e-9;
template <typename A, typename B> inline bool chmin(A &a, B b){if(a > b) {a = b; return 1;} return 0;}
template <typename A, typename B> inline bool chmax(A &a, B b){if(a < b) {a = b; return 1;} return 0;}
template <typename A, typename B> inline LL add(A x, B y) {if(x + y < 0) return x + y + mod; return x + y >= mod ? x + y - mod : x + y;}
template <typename A, typename B> inline void add2(A &x, B y) {if(x + y < 0) x = x + y + mod; else x = (x + y >= mod ? x + y - mod : x + y);}
template <typename A, typename B> inline LL mul(A x, B y) {return 1ll * x * y % mod;}
template <typename A, typename B> inline void mul2(A &x, B y) {x = (1ll * x * y % mod + mod) % mod;}
template <typename A> inline void debug(A a){cout << a << '\n';}
template <typename A> inline LL sqr(A x){return 1ll * x * x;}
inline int read() {
    char c = getchar(); int x = 0, f = 1;
    while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
    while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
    return x * f;
}
int N, K, fac[MAXN];
vector<int> res;
int find(int x) {
    sort(res.begin(), res.end());
    int t = res[x];
    res.erase(res.begin() + x);
    return t;
}
bool check(int x) {
    while(x) {
        if((x % 10) != 4 && (x % 10) != 7) return 0;
        x /= 10;
    }
    return 1;
}
int ans;
void dfs(int x, int Lim) {//計算1 - lim中只包含4 7的數量 
    if(x > Lim) return ;
    if(x != 0) ans++;
    dfs(x * 10 + 4, Lim);
    dfs(x * 10 + 7, Lim);
}
signed main() {
    N = read(); K = read() - 1;
    int T = -1; fac[0] = 1;
    for(int i = 1; i <= N;i++) {
        fac[i] = i * fac[i - 1];
        res.push_back(N - i + 1);
        if(fac[i] > K) {T = i; break;}
    }
    if(T == -1) {puts("-1"); return 0;}
    dfs(0, N - T);
    for(int i = T; i >= 1; i--) {
        int t = find(K / fac[i - 1]), pos = N - i + 1;
        if(check(pos) && check(t)) ans++;
        K = K % fac[i - 1];
    }
    cout << ans;
    return 0;
}
/*

*/

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 個人博客原文: "迪米特法則" 設計模式六大原則之五:迪米特法則。 簡介 姓名 :迪米特法則 英文名 :Law of Demeter 小名 :最少知識原則 小名英文名 :Least Knowledge Principle 價值觀 :媽媽說不和陌生人說話 個人介紹 : 1. Each unit sho ...
  • 系統介紹: 1.系統採用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC瀏覽器使用) 2.springmvc +spring4.3.7+ mybaits3.3 SSM 普通java web(非maven, 附贈pom.xml文件) 資料庫:mysql 3.開發工具:my ...
  • 當對象之間存在一對多的關係時,若需要進行對象之間的通知,則可使用觀察者模式 介紹 觀察者模式屬於行為型模式,當一個對象的狀態發生改變時,若我們想通知其他對象,此時可通過觀察者模式來進行解決。 類圖描述 代碼實現 1、定義抽象觀察者 2、定義觀察者管理類 3、定義具體觀察者 4、上層調用 總結 觀察者 ...
  • (1)首先進入cmd,輸入pip install yagmail (2)思路:1 、連接伺服器:yagmail.SMTP(郵箱賬號,郵箱密碼,郵箱伺服器地址,郵箱伺服器埠) 2 、準備正文內容:contents="XXXXXXXX" 3 、發送郵件:yag.send(收件人列表,郵件主題,郵件內容 ...
  • 首先JVM的記憶體結構包括五大區域: 程式計數器、虛擬機棧、本地方法棧、方法區、堆區。其中程式計數器、虛擬機棧和本地方法棧3個區域隨線程啟動與銷毀, 因此這幾個區域的記憶體分配和回收都具有確定性,不需要過多考慮回收的問題。而Java堆區和方法區則不一樣,這部分記憶體的分配和回收是動態的,正式垃圾回收需要關 ...
  • import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;... ...
  • 哎,自從有了女朋友,自己的業餘時間少了好多,連博客都忘了更新了,差點忘了一個月! 但是好在,沒有忘記寫代碼,而且還解決了一個困擾好久的問題(其實是解決了一半,就在最後一個函數里,因為藍圖比較複雜所以還沒弄清) 今晚剛見了她媽回來,可能這次要來真的了! 今年可能會結婚,也可能會要孩子吧! 公司的項目也 ...
  • Java中實現內部類 內部類相信大家都用過很多次了,就不說它是怎麼用的了。 內部類 1.成員內部類 需要註意的是, 當成員內部類擁有和外部類同名的成員變數或這方法時, 預設情況下訪問的是內部類的成員, 如要訪問外部類的同名成員, 需要使用以下形式: 內部類是依附外部類而存在的, 也就是說要創建成員內 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...