題目大意:給出乙個長度為 6 的字串 s ,再給出模數 mod,現在規定雜湊值為如下運算:
const int len = 6;問是否存在乙個字串,字典序大於 s 且雜湊值相等int mod;
int hash(char str)
return res;
}
題目分析:讀完題後陷入思維定式好一段時間,固然以為雜湊值是需要有字串才行,於是想到用dfs暴力列舉子串然後全排列,一開始沒計算好時間複雜度,以為是可行的,搗鼓了半天dfs,最後認真算了一遍列舉的複雜度為 26^6*a(6)*6,其中26^6是列舉字串所需要花費的時間,a(6)是對長度為 6 的字串全排列所需要的時間,也就是 720 ,還有常數 6 是需要計算字串的雜湊值,先不管別的,26^6就已經3e8了,顯然暴力是不可行的
於是就敞開思維開始亂猜了,發現如果想要找到滿足題目要求的字串,只需將當前字串向後 mod 個單位就好了,稍微一轉換,會發現其實每一位字元代表的區間分別為[ 0 , 26 ),[ 26 , 26^2 ),[ 26^2 , 26^3 ) 以此類推,進一步再轉換一下,會發現這其實不就是將字串 s 當成乙個 26 進製的數字來計算,到此為止豁然開朗,直接模擬即可
**:
#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const int n=1e5+100;
int q_pow(int a,int b)
return ans;}
int main()
string ans;
for(int i=0;i<6;i++)
reverse(ans.begin(),ans.end());
cout<}
return 0;
}
進製轉換 牛客
將乙個長度最多為30位數字的十進位製非負整數轉換為二進位制數輸出。多組資料,每行為乙個長度不超過30位的十進位製非負整數。注意是10進製數字的個數可能有30個,而非30bits的整數 每行輸出對應的二進位制數。示例1 013 8 0111 1000 這是一道關於大數整數的處理,對於長度為30的整數,...
牛客網 進製轉換
題目描述 給定乙個十進位制數m,以及需要轉換的進製數n。將十進位制數m轉化為n進製數 輸入描述 輸入為一行,m 32位整數 n 2 n 16 以空格隔開。輸出描述 為每個測試例項輸出轉換後的數,每個輸出佔一行。如果n大於9,則對應的數字規則參考16進製制 比如,10用a表示,等等 分析 較簡單,主要...
牛客題 進製轉換
給定乙個十進位制數m,以及需要轉換的進製數n。將十進位制數m轉化為n進製數 主要考慮負數情況和10進製以上怎麼轉換,進製轉換我們知道就是將m對n進行取餘,得到的結果就是低位的值,之後m m n 2進製用0,1表示 8進製由0 7表示 10進製是0 9表示,十六進製制由 0123456789abcde...