如何最快地將一個字複製N次?

假設只用Ctrl+(A,C,V)。
假設一隻手按住Ctrl。
不考慮手指在鍵盤上空的移動,即只考慮按鍵次數。
記x為屏幕上的字數,y為被選中的字數,z為剪貼板中的字數。
初始x=1,y=0,z=0。
Ctrl+A的效果:y=x。
Ctrl+C的效果:z=y。
Ctrl+V的效果:x=x+z-y,y=0。


可以參考一下這篇文章:蛋疼研究之怎樣刷屏最快?

以下是文章內容,轉載自 Matrix67 大牛:

  最近在做網站測試時,遇到了需要在輸入框輸入 3000 字的測試用例。聯想到平時聊天時經常複製粘貼一堆笑臉刷屏討 MM 歡心的行為,不由想到了一個有趣的問題:為了輸入一定數量的字元,最少需要按多少個鍵?

  大家最常用的策略或許是, 先輸一些字元,然後全選複製,粘貼到一定規模後,再全選複製,粘貼到一個新的數量級,如此反覆。注意到進入全選狀態(並且複製後),第一次粘貼將會覆蓋掉選中的部分,第二次粘貼才會增加原來的文本長度。當然,全選複製後按一次向右鍵也可以消除選中狀態,不過卻並沒有節省按鍵次數。因此我們規定,在輸入字元時只有四種原子操作:

  1. 按一個按鍵,輸入一個字元
  2. 按 Ctrl + A ,全選
  3. 按 Ctrl + C ,複製
  4. 按 Ctrl + V ,粘貼


  排除明顯不划算的行為,真正的決策其實只有兩種:

  1. 按一次按鍵,輸入一個字元
  2. 按 k + 2 次按鍵,將現有內容複製成 k 份。

  這樣一來,我們就有了一個清晰的遞推思路。設 f(n) 表示輸入 n 個字元所需要的最少按鍵次數,則 f(n) 將會在 f(n-1) + 1 和 f(n/k) + k + 2 中取一個最小值(其中 k 取遍 n 的所有約數)。
  Mathematica 牛 B 就牛 B 在,這樣的動態規劃程序只需要一行便能寫完:

  可見,輸入 100 個字元需要 18 次按鍵。具體方法是,用 5 次按鍵輸入 5 個字元,再用 7 次按鍵把它變成 25 個字元,再用 6 次按鍵把它變成 100 個字元。

  有趣的是,這個函數並不是單調的。輸入 99 個字元需要的按鍵次數比輸入 100 個字元需要的按鍵次數更多一些,事實上這最少要花費 20 次按鍵。方法是,先用 5 次按鍵輸入 5 個字元,4 次按鍵把它變成 10 個字元,單獨按一次鍵添加一個字元, 5 次按鍵把字元數複製粘貼到 33 ,再來 5 次按鍵把字元數複製粘貼到 99 。

  下面這個圖是輸入不同的字元數所需要的最少按鍵。

  可以看到, 20 次按鍵足以應付 100 以內任何數量的字元,也就是說 99 個字元所需要的按鍵次數已經是 100 個字元以內的情況中最大的了。不過,最悲劇的應該要數 83 個字元了,它是所有至少要用 20 次按鍵的情況中字元個數最少的(也即首次出現的要用 20 次按鍵才能輸入的情況)。對應的輸入方案是 5 → 20 → 80 → 81 → 82 → 83 (直到分析到這裡,我才意識到,在考慮輸入指定數量的字元時,引入退格鍵可以帶來的更少的按鍵次數)。

  那麼, 20 次按鍵最多可以輸入多少個字元呢?為了解決這個問題,我們可以給出另外一個遞推式。令 g(n) 為 n 次按鍵最多可以輸入的字元個數。對於每一個 n ,考慮兩種轉移決策:要麼在 n – 1 次按鍵能夠達到的最大字元數基礎上加 1 ,要麼把 n – k 次按鍵能夠達到的字元數複製成 k – 2 份。也就是說, g(n) 就等於 g(n-1) + 1 和 g(n-k) * (k-2) 的最大值,其中 k 可以從 3 取到 n – 1。我們還是用一句話寫下這個轉移方程式:

  可以看到, 20 次按鍵足以輸入 150 個字元(方案是 6 → 30 → 150 ), 30 次按鍵足以輸入 1600 個字元(方案是 5 → 25 → 100 → 400 → 1600 )。這樣看上去,我們好像有了快速刷屏的指導思想:粘貼到原來的 4 倍長或者 5 倍長後再進行下一波全選複製粘貼似乎總是最優的選擇。另外,這個數列增長得很快, 80 次按鍵能輸入的字元數就已經上億了。看來,要想刷屏到系統崩潰並不難,不足 100 次按鍵就能產生上 G 的數據。

  似乎這個增長速度是指數級的。描出 g(n) 的圖象證實了我們這一想法:

  我們自然而然地想到觀察數列 g(n) 相鄰兩項的比值:

  容易看到,當 n 到了一定大時,數列已經呈現出了一定的規律,多數時候都是以 1.25 倍的速度增長。給出並證明數列的通項公式或許會是一件非常有趣的事情。


題主的模型比Matrix67的簡單,所以答案也沒那麼複雜。。。
N=2^nprod_{k=1}^mp_k^{n_k}, 其中p_k為奇素數,則從1個字元複製至N個字元需要5lfloor n/2
floor+6(n/2-lfloor n/2
floor)+sum_{k=1}^n(p_k+1)n_k, 證明留作練習。


內什麼我是來歪樓的:100i,200i,想幾次就幾次。。。


1,2,4,8,16,32,64…


呃。。。我這裡怎麼是按住不放就一直會複製下去


不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看不信你看


以前做過這麼一個題 BNUOJ 4349 - 精確刷屏工具
正解的確是動態規劃
推數學公式的話。。。QAQ不會


複製粘貼,然後複製兩個字粘貼,然後複製四個字粘貼,複製八個粘貼,複製十六個粘貼,複製三十二個粘貼,複製六十四個粘貼。具體操作就是按住ctrl然後A C V A C V一直按。。


打開vim,按v選中被複製的內容,按d,然後np(n爲需複製的次數,用d是爲了省去n - 1的計算)。
若是從vim之外複製,那就到vim中按n」+p,再gg」+yG複製出來,完畢。


推薦閱讀:

5*5矩陣方格棋盤中,只能向方格中填入0或1,要使得棋盤的每行和每列的值的總和都是偶數,共有多少種可能性?
我看了我家的鐘,12:00,三針重合,想問一下子除了12點,其他時間段時分秒三針如何重合?
怎麼來理解伽瑪(gamma)分布?
牛頓為什麼用拉丁文寫《自然哲學的數學原理》?

TAG:數學 | 組合數學Combinatorics |