洛谷 P3214 [HNOI2011] 卡農


題目傳送門


前言

再次敗在 d p dp dp 手下,但是數據范圍這么小應該是可以看出是 d p dp dp 的(畢竟對于其他組合數的問題數據范圍都是 1 0 9 10^9 109 起步)。


思路

題意簡化

現有 1 , 2 , 3 , . . . , n ? 1 , n 1, 2, 3, ... , n - 1, n 1,2,3,...,n?1,n,從其所組成的 2 n ? 1 2^n - 1 2n?1 個非空集合中選出 m m m 個,每個集合只能選一次,求【使 ? i ∈ [ 1 , n ] \forall i \in [1, n] ?i[1,n] 在所選集合中,出現次數均為偶數的】的選擇方案書,答案對 1 0 8 + 7 10^8 + 7 108+7 取模。

明確兩點:

  1. 出現 0 0 0 次也算出現偶數次;
  2. 一個集合中,不可能出現兩個相同的數(集合的互斥性)。

狀態設計

d p i dp_i dpi? 表示選了 i i i 個集合的合法方案數。
注意:在之后的轉移使,我們先 只需要讓這 i i i 個集合 滿足“每個數出現次數為偶數”的限制。

狀態轉移

限制 1 1 1:每個數只能出現偶數次

首先看起來題目所給的“每個數出現偶數次”的限制不太好弄,所以我們先考慮假如已經有 i ? 1 i - 1 i?1 個確定的集合,可以怎么添加一個集合,使得這 i i i 個集合滿足這條限制。

對于一個數 x x x

  1. 假如它在前 i ? 1 i - 1 i?1 個集合中出現了奇數次,那么它一定要在最后一個集合在出現一次,這樣才能保證 x x x i i i 個集合中總共出現了偶數次;
  2. 假如它在前 i ? 1 i - 1 i?1 個集合中出現了偶數次,那么它就不可能出現在最后一個集合中,因為為了維持其出現偶數次,且每個集合不能出現相同的數,所以在最后一個集合中,其出現次數只能為 0 0 0

由上述看題解分析,假如已經確定了 i ? 1 i - 1 i?1 個集合,那最后一個集合就是確定的。

先不管其他限制,就但從這條限制來看,它就有 A 2 n ? 1 i ? 1 A_{2^n - 1}^{i - 1} A2n?1i?1? 種可能(這里之所以是排列不是組合,是因為題目讓我們求出的【所選集合方案是不顧選出集合順序的】,所以我們在最后讓答案乘以 m ! m! m! 的逆元就好了)。

限制 2 2 2:集合不能為空集

由于可能在前 i ? 1 i - 1 i?1 個集合中,每一個數都出現了偶數次,所以在最后一個集合中任何數都不能出現,即最后一個集合使空集,這樣是不合法的。

我們從容斥角度考慮轉移,看看最后一個集合為空集的有多少種可能。

把最后一個空集去除后,發現剩下的 i ? 1 i - 1 i?1 個集合正好是一個滿足【取 i ? 1 i - 1 i?1 個集合使其滿足 “每個數只能出現偶數次” 限制】的取集合方案(因為若最后一個集合為空集,那么前 i ? 1 i - 1 i?1 個集合就必定滿足 “每個數出現偶數次” 限制),這樣的情況有 d p i ? 1 dp_{i - 1} dpi?1? 種。

所以在總的選擇方案中減去 d p i ? 1 dp_{i - 1} dpi?1? 就行。

限制 3 3 3:每個集合只能選一次,即不能出現兩個相同的集合

由于前 i ? 1 i - 1 i?1 個集合一定互不相同(因為我們是從 n n n 個數組成的 2 n ? 1 2^n - 1 2n?1 個互不相同的集合中選出的),所以只考慮【第 i i i 個集合與前 i ? 1 i - 1 i?1 個集合中】有一個相同的方案。

先明確一點:假如 i i i 與前 i ? 1 i - 1 i?1 個集合中的某個相同(假設是第 j j j 個集合),那么決定第 i i i 個集合構造方法的就是集合 j j j

因此,我們如果去除集合 i , j i, j i,j,那么剩下的 i ? 2 i - 2 i?2 個集合一定能形成一組滿足【取 i ? 2 i - 2 i?2 個集合使其滿足 “每個數只能出現偶數次” 限制】的取集合方案。因為兩個集合中的數相同,因此刪除這兩個集合的話,集合中的數也是成對被刪除的,因此能構成。這樣的 i ? 2 i - 2 i?2 個集合共有 d p i ? 2 dp_{i - 2} dpi?2? 種。

又因為 j j j i ? 1 i - 1 i?1 種取法,集合 i i i 2 n ? 1 ? ( i ? 2 ) 2^n - 1 - (i - 2) 2n?1?(i?2) 種(即在所有的 2 n ? 1 2^n - 1 2n?1 個集合中,去除【已有的 i ? 2 i - 2 i?2 個集合】剩下的之中,再選一個),剩下的 i ? 2 i - 2 i?2 個集合共有 d p i ? 2 dp_{i - 2} dpi?2? 種,所以這個非法方案數是 ( i ? 1 ) × ( 2 n ? 1 ? ( i ? 2 ) ) × d p i ? 2 (i - 1) \times (2^n - 1 - (i - 2)) \times dp_{i - 2} (i?1)×(2n?1?(i?2))×dpi?2?

綜上,轉移方程就是:
d p i = A 2 n ? 1 i ? 1 ? d p i ? 1 ? ( i ? 1 ) × ( 2 n ? 1 ? ( i ? 2 ) ) × d p i ? 2 dp_i = A_{2^n - 1}^{i - 1} - dp_{i - 1} - (i - 1) \times (2^n - 1 - (i - 2)) \times dp_{i - 2} dpi?=A2n?1i?1??dpi?1??(i?1)×(2n?1?(i?2))×dpi?2?

邊界條件

首先是 d p 1 = 0 dp_1 = 0 dp1?=0:因為只選一個非空的不重集合就讓每個數出現偶數次顯然是不可能的;
其次是 d p 2 = 0 dp_2 = 0 dp2?=0:因為要在前兩個集合中,就使每個數出現偶數次,要么得是兩個空集,要么兩個集合就得一樣,這樣顯然也是不合法的。

答案

d p m × i n v ( m ! ) dp_m \times inv(m!) dpm?×inv(m!),因為題目要求出的集合是不顧 m m m 個集合順序的,而在計算時我們有考慮了其順序,所以要除去 m ! m! m!

復雜度

時間空間均為 O ( m ) O(m) O(m)


代碼

#include <bits/stdc++.h>#define int long longusing namespace std;const int maxn = 1e6 + 7;
const int mod  = 1e8 + 7;int n, m;
int facm = 1, invm;
int tot;
int qpow(int x, int y) {int res = 1;for (; y; y >>= 1, x = x * x % mod)if (y & 1) res = res * x % mod;return res;
}int dp[maxn], A[maxn];
signed main() {scanf("%lld%lld", &n, &m);for (int i = 1; i <= m; ++i)facm = facm * i % mod;invm = qpow(facm, mod - 2);tot = (qpow(2, n) - 1 + mod) % mod;A[0] = 1;for (int i = 1; i <= m; ++i)A[i] = A[i - 1] * (tot - i + 1) % mod;dp[1] = dp[2] = 0;for (int i = 3; i <= m; ++i)dp[i] = ((A[i - 1] - dp[i - 1] - (tot - i + 2) * (i - 1) % mod * dp[i - 2] % mod) % mod + mod) % mod;printf("%lld\n", dp[m] * invm % mod);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75775.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75775.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75775.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【年份數據類型及使用】

在數據分析中,年份的處理需要根據具體場景選擇合適的數據類型,以確保后續分析的準確性和效率。以下是常見的年份數據類型及使用場景: 1. 數值類型(整數或浮點數) 適用場景: 僅需存儲年份數值(如 2020, 2023),無需進行日期計算。需要將年份作為連續變量參與數學運算(如…

詳解七大排序

目錄 一.直接插入排序 &#xff08;1&#xff09;基本思想 &#xff08;2&#xff09;算法步驟 &#xff08;3&#xff09;代碼實現 &#xff08;4&#xff09;算法特性 &#xff08;5&#xff09;算法優化 &#xff08;6&#xff09;示例演示 二.希爾排序 &#xff08…

YOLOv12 訓練從這里開始:LabelImg 標注數據集

視頻講解&#xff1a; YOLOv12 訓練從這里開始&#xff1a;LabelImg 標注數據集 labelimg https://github.com/tzutalin/labelImg sudo apt-get install pyqt5-dev-tools pip3 install lxml git clone https://github.com/tzutalin/labelImg.git cd labelImg 開始編譯 make…

Day2:前端項目uniapp壁紙實戰

先來做一個輪番圖。 效果如下&#xff1a; common-style.css view,swiper,swiper-item{box-sizing: border-box; } index.vue <template><view class"homeLayout"><view class"banner"><swiper circular indicator-dots autoplay…

SAP-ABAP:ABAP `LEAVE LIST-PROCESSING` 深度解析

ABAP LEAVE LIST-PROCESSING 深度解析 核心機制 模式切換(Dialog → List) 中斷屏幕流 強制終止當前Dialog程序的PBO/PAI處理,脫離屏幕序列控制(如事務碼SE38執行的程序)。觸發報表事件 激活類報表程序的事件鏈:INITIALIZATION → AT SELECTION-SCREEN → START-OF-SEL…

在PyTorch中使用GPU加速:從基礎操作到模型部署

本文將通過具體代碼示例&#xff0c;詳細介紹如何在PyTorch中利用GPU進行張量計算和模型訓練&#xff0c;包含設備查詢、數據遷移以及模型部署等完整流程。 1. 查看GPU硬件信息 使用 nvidia-smi 命令檢查GPU狀態和進程信息&#xff1a; # 查看GPU信息 !nvidia-smi 輸出示例&…

lib-zo,C語言另一個協程庫,dns協程化, gethostbyname

lib-zo,C語言另一個協程庫,dns協程化, gethostbyname 另一個 C 協程庫 https://blog.csdn.net/eli960/article/details/146802313 本協程庫 支持 DNS查詢 協程化. 禁用所有 UDP 協程化 zvar_coroutine_disable_udp 1;禁用 53 端口的UDP 協程化 zvar_coroutine_disable_ud…

Java第三節:新手如何用idea創建java項目

作者往期文章&#xff1a; Java第一節&#xff1a;debug如何調試程序&#xff08;附帶源代碼&#xff09;-CSDN博客 Java第二節&#xff1a;debug如何調試棧幀鏈&#xff08;附帶源代碼&#xff09;-CSDN博客 步驟一 ? 步驟二 ? 步驟三 創建src文件夾包含main文件&#…

(一)從零開始:用 LangChain 和 ZhipuAI 搭建簡單對話

最近一直在研究如何用 LangChain 和 ZhipuAI 搭建一個智能對話系統&#xff0c;發現這個組合真的非常強大&#xff0c;而且實現起來并不復雜。今天就來分享一下我的學習過程和一些心得體會&#xff0c;希望能幫到同樣在探索這個領域的小伙伴們。 一、 環境搭建&#xff1a;從零…

uniapp地圖導航及后臺百度地圖回顯(v2/v3版本)

百度地圖申請地址&#xff1a;控制臺 | 百度地圖開放平臺 效果&#xff1a; 1.后臺 1.1申請百度地圖APi 1.2 引入百度地圖 <script type"text/javascript" src"//api.map.baidu.com/api?v3.0&ak自己百度生氣apikey"></script> 1.3 v2組…

Java模板方法模式詳解

模板方法模式詳解 一、模式定義 模板方法模式(Template Method Pattern)定義一個操作中的算法骨架&#xff0c;將某些步驟延遲到子類實現。 二、核心結構 1. 抽象模板類 public abstract class AbstractTemplate {// 模板方法&#xff08;final防止子類覆蓋&#xff09;pu…

(5)模擬后——Leonardo的可視化操作

1 引言 經過n天的模擬&#xff0c;模擬結果相信已經到手&#xff0c;但如何進行分析呢。 首先是可視化&#xff0c;可視化方法基本分為兩類 基于ENVI-met自帶軟件Leonardo的可視化操作基于NetCDF的可視化操作 2 模擬結果變量說明 首先&#xff0c;模擬結果會有以下幾個文件…

基于YOLO11實例分割與奧比中光相機的快遞包裹抓取點檢測

本博客來源于CSDN機器魚&#xff0c;未同意任何人轉載。 更多內容&#xff0c;歡迎點擊本專欄&#xff0c;查看更多內容。 0 引言 項目采用六軸機械臂搭配末端真空吸盤&#xff0c;從無序包裹中抓取想要的包裹。AI算法需要提供各包裹的抓取點的3D坐標與3D姿態。由于快遞包裹含…

【學Rust寫CAD】31 muldiv255函數(muldiv255.rs)

源碼 // Calculates floor(a*b/255 0.5) #[inline] pub fn muldiv255(a: u32, b: u32) -> u32 {// The deriviation for this formula can be// found in "Three Wrongs Make a Right" by Jim Blinn.let tmp a * b 128;(tmp (tmp >> 8)) >> 8 }代…

藍橋云客--團隊賽

2.團隊賽【算法賽】 - 藍橋云課 問題描述 藍橋杯最近推出了一項團隊賽模式&#xff0c;要求三人組隊參賽&#xff0c;并規定其中一人必須擔任隊長。隊長的資格很簡單&#xff1a;其程序設計能力值必須嚴格大于其他兩名隊友程序設計能力值的總和。 小藍、小橋和小杯正在考慮報名…

#Linux內存管理# 假設設備上安裝了一塊2G的物理內存,在系統啟動時,ARM Linux內核是如何映射的?

在ARM Linux系統啟動過程中&#xff0c;對2GB物理內存的映射實現分為以下幾個關鍵階段&#xff1a; 一、設備樹解析與內存信息獲取 1.設備樹定義 物理內存范圍通過設備樹&#xff08;DTS&#xff09;的memory節點定義&#xff0c;例如&#xff1a; memory60000000 { device_ty…

使用MATIO庫讀取Matlab數據文件中的多維數組

使用MATIO庫讀取Matlab數據文件中的多維數組 MATIO是一個用于讀寫Matlab數據文件(.mat)的開源C庫。下面是一個完整的示例程序&#xff0c;展示如何使用MATIO庫讀取Matlab數據文件中的多維數組。 示例程序 #include <stdio.h> #include <stdlib.h> #include <…

react+antd中做一個外部按鈕新增 表格內部本地新增一條數據并且支持編輯刪除(無難度上手)

需求背景 做一個可以外部控制新增刷新表格 表格內部可以編輯刪除 類似下方需求圖 實現過程 因為我實現時有兩個這樣的表格 所以我的事件里面會有傳參用于判斷 可忽略傳參判斷部分 代碼中有formatMessage部分為國際化可忽略 <div style{{ marginBottom: 10px, margin…

【深度學習新浪潮】視覺與多模態大模型文字生成技術研究進展與產品實踐

一、研究進展 跨模態架構創新 原生多模態模型:微軟KOSMOS系列通過統一框架支持文本、圖像、語音等多模態輸入輸出,實現跨模態推理與遷移。例如,KOSMOS-2.5可處理文本密集圖像,生成結構化文本描述,并通過重采樣模塊優化視覺與語言的對齊。混合專家架構:第三代模型(如Deep…

重生之我是去噪高手——diffusion model

diffusion model是如何運作的&#xff1f; 想象一下&#xff0c;你有一張清晰的圖片。擴散模型的核心思想分為兩個過程&#xff1a; 前向過程&#xff08;Forward Process / Diffusion Process&#xff09;&#xff1a;逐步加噪反向過程&#xff08;Reverse Process / Denois…