安徽集訓 Entropy

2022-05-02 03:42:06 字數 3380 閱讀 9172

出題人羅哲正是神爺 orz

這是一道披著互動題外衣的通訊題,只支援 c++。

你需要實現 \(2\) 個函式。

互動庫先給第乙個函式傳入乙個引數 \(n\),你加密得到的 \(01\) 字串的長度必須是 $n。你需要根據 \(n\) 做一些相應的預處理,並向互動庫返回你能接受的最大 \(\text\) 型別整數 \(m\)。

先根據你返回的 \(m\) 給分。若 \(m_\gt m_\) 則你得 \(0\) 分,若 \(m_=m_\) 則你得 \(100\) 分,否則你得 \(0.5\frac}}}}\) 分。

這題出到這裡可以結束了。但出題人為了驗證你的 \(m\) 是算的還是蒙的,又給了 \(q\) 次操作,每次操作中:

互動庫向第乙個函式輸入乙個 \([0,m-1]\) 內 \(\text\) 型別的數,你可以用任意加密手段,將該數加密成乙個 \(n\) 位 \(01\) 字串並返回給互動庫。

然後互動庫向第二個函式輸入你剛才加密得到的密串,這個密串有可能被互動庫惡搞,導致該串所有位取反,然後整個串翻轉。你需要用適當的解密手段,將其解密為一開始向第乙個函式輸入的 \(\text\) 型別的數,並返回給互動庫。

每次操作後,互動庫會判斷第二個函式返回的數 是否和一開始向第乙個函式輸入的數一樣。

一旦有一次操作加密前的數和解密後的數不一樣,你就得不到解密分數,即之前根據 \(m\) 得的分數打折 \(20\%\)。

有防作弊機制(即開全域性變數記錄原數),詳見原題面。

subtask1 (30pts):\(n\le 18\)

subtask2 (70pts):\(n\le 60\)

對於所有資料,\(0\le q\le 50000\)

由於互動題描述很長,我懶得一字不差地搬完,下面放上完整題面,但問題描述寫得有點噁心,我一開始沒看懂

設 \(k\) 是長度為 \(n\) 且被惡搞後不變的串的數目。

先考慮 \(n\) 是奇數的情況。

顯然翻轉之後正中間的乙個 bit 一定會取反,此時 \(k=0,\space m=2^\)。編碼方式也很簡單,讓正中間的 bit 為 \(0\),解碼時若正中間的 bit 為 \(1\) 則執行惡搞操作。

然後是(我)想不到的 \(n\) 是偶數的情況。

不難算出 \(k=2^}\),因為乙個串被惡搞後與原串相同,當且僅當這個 \(01\) 串的第 \(1\) 位與第 \(n\) 位不同,第 \(2\) 位與第 \(n-1\) 位不同,第 \(3\) 位與第 \(n-2\) 為不同,以此類推,共 \(\frac\) 組對稱位。這些被惡搞後不變的串互不混淆,都可以作為密串

對於其餘所有被惡搞後有變化的串,一定是兩兩配對,共 \(\frac}}\) 對。每一對中我們只能使用乙個數作為加密後的串,因為一對中的 \(2\) 個都選的話,萬一互動庫把你加密後的串惡搞了,你就無法區分這兩種密串,也就不知道應該用哪種密串解密出原數。

那麼在密串長度為 \(n\) 的限制下,共有 \(2^} + \frac}} = 2^ + 2^-1}\) 種互不混淆的密串。

神奇操作:我們可以把 \([0,m-1]\) 種所有整數一一對映到這些密串,故 \(m=2^ + 2^-1}\)。

那我們怎麼構造一種對映方式呢?

我們肯定得從密串中摳出 \(1\) 或 \(2\) 位,來標記這個串是否被惡搞,不然肯定沒法做。

而且為了固定這個標記位,即被惡搞後不會翻轉到對稱位(你的第 \(2\) 個程式無法判斷收到的密串的標記位有沒有被翻到對稱位,因為你只能通過標記位判斷密串有沒有翻轉),若摳出 \(1\) 位,那麼串長 \(n\) 必須是奇數,而這裡是偶數,舍。故我們要從密串中摳出 \(2\) 位,且這 \(2\) 位對稱。

摳**呢?

這裡一般就是盲猜結論了,大佬們都覺很簡單……當然我可以寫乙個推法(?)

把 \(m=2^ + 2^-1}\) 的值寫成二進位制數,發現只有 \(2\) 位為 \(1\),故該值也寫成 \(2^} - \sum\limits_^ 2^\)

\(2^\) 可以拆成 \(2^ 2^\)

觀察一下這是什麼?設摳掉了密串的第 \(k\) 位和第 \(n-k+1\) 位,\(k-1\) 表示的是密串前 \(k-1\) 位和後 \(k-1\) 位,\(n-2k\) 表示的是密串的第 \(k+1\) 位到第 \(n-k\) 位。那麼,第 \(k\) 位和第 \(n-k+1\) 位就被空出來了!可以把這兩位當作標記位!

設 \(x\) 為滿足密串第 \(x\) 位不等於第 \(n-x+1\) 位條件下的最小值,我們把所有密串按 \(x\) 從小到大分類。顯然 \(x\) 的範圍是 \([1,\frac+1]\),其中 \(x=\frac+1\) 的意義比較特殊,表示每一組對稱位上的數都相同。

由於前 \(x-1\) 組對稱位上的數都相同,故給每一位放乙個 \(0\) 或 \(1\),方案數為 \(2^\);第 \(x+1\) 到 \(\frac\) 組對稱位上的數沒有要求,故給每一位放乙個 \(0\) 或 \(1\),方案數為 \(2^\)。

發現這種設標記位的方式 恰好可以對映 \(m\) 個數。於是我們可以據此構造對映方式了!

對映方式很簡單,我們把密串看成二進位制數,自創乙個二進位制數比大小的規則,以確定 \(m\) 個用於對映的二進位制數的排名,其排名 \(-1\) 就是對映到的 \([0,m-1]\) 中的原數。

規則:以 \(x\) 從小到大為第一關鍵字,第 \(1\) 到 \(n-x+1\) 組成的二進位制數從小到大為第二關鍵字。

有了規則,設原數為 \(a\),則加密時求排第 \(a+1\) 名的密串,解密時求密串的排名 \(-1\) 即可。

#include#define ll long long

using namespace std;

class entropy

string getstr(char x)

string encode(ll x)

break;

}x -= y;}}

return ret;

}ll decode(string str)

}else}}

else

for(int j=n-i-2; j>i; j--)

}ret += tmp;

break;

}ret += (1ll

return ret;

}};#include "entropy.h"

Entropy演算法python實現

熵屬於物理概念,最先由申農引入到資訊理論,目前已經在工程技術 社會經濟等領域得到了非常廣泛的應用。熵權法的基本思路是依據指標變異性的大小來確定權重。其前提是,若某個指標的資訊熵越小,則指標值得變異程度越大,在綜合評價中所能起到的作用也越大,其權重越大。相反,某個指標的資訊熵越大,則指標值得變異程度越...

安徽上學路線

思路 跑spfa 網路流最小割。跑正反兩邊spfa,然後拎出一條邊,判斷邊權 左端點到1號節點的最短路 右端點到n號節點的最短路 離1號節點近的點為左端點,反之為右端點 是否等於1到n的最短路,如果相等左右端點連邊,權值為這條邊代價。然後跑dinic。分析 真是桑心!這道題切了乙個晚上,最後在rc ...

poj 1521 Entropy(優先佇列)

哈弗曼編碼題 如果真的去構建一顆哈夫曼樹,那就太麻煩了 而且根據題目要求的輸出可以知道沒有必要構造乙個完整的樹 根據哈夫曼樹的特點,可知道可以用優先佇列實現功能 每次從佇列中取兩個最小的,將其和再放入佇列 一直重複這個操作知道佇列中只剩乙個元素 如下 include include include ...