出題人羅哲正是神爺 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^\)對映方式很簡單,我們把密串看成二進位制數,自創乙個二進位制數比大小的規則,以確定 \(m\) 個用於對映的二進位制數的排名,其排名 \(-1\) 就是對映到的 \([0,m-1]\) 中的原數。\(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\) 個數。於是我們可以據此構造對映方式了!
規則:以 \(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 ...