題目:任意給定乙個正整數n,求乙個最小的正整數m(m>1),使得n*m的十進位制表示形式裡只含有1和0.
解決這個問題首先考慮對於任意的n,是否這樣的m一定存在。可以證明,m是一定存在的,而且不唯一。
簡單證明:因為
這是乙個無窮數列,但是數列中的每一項取值範圍都在[0, n-1]之間。所以這個無窮數列中間必定存在迴圈節。即假設有s,t均是正整數,且s例如,取n=3,因為10的任何非負次方模3都為1,所以迴圈節週期為1.有:
給定n,求m的方法:
方法一:給定n,令m從2開始,列舉m的值直到遇到乙個m使得n*m的十進位制表示中只有1和0.
方法二:求出10的次方序列模n的餘數序列並找出迴圈節。然後搜尋這個餘數序列,搜尋的目的就是要在這個餘數序列中找到一些數出來讓它們的和是n的倍數。例如n=13,這個序列就是1,10,9,12,3,4然後不斷迴圈。很明顯有1+12=13,而1是10的0次方,12是10的3次方,所以這個數就是1000+1=1001,m就是1001/13=77。
方法三:因為n*m的取值就是1,10,11,100,101,110,111,......所以直接在這個空間搜尋,這是對方法一的改進。搜尋這個序列直到找到乙個能被n整除的數,它就是n*m,然後可計算出m。例如n=3時,搜尋樹如下:
上圖中括號內表示模3的餘數。括號外表示被搜尋的數。左子樹表示0,右子樹表示1.上圖中搜尋到第二層(根是第0層)時遇到111,它模3餘數為0.所以n*m=111, m=111/3=37。
方法四:對方法三的改進。將方法三的搜尋空間按模n餘數分類,使得搜尋時間和空間都由原來的指數級降到了o(n)。改進的原理:假設當前正在搜尋由0,1組成的k位十進位制數,這樣的k位十進位制數共有2^k個。假設其中有兩個數x、y,它們模n同餘,那麼在搜尋由0、1組成的k+1位十進位制數時,x和y會被擴充套件出四個數:10x, 10x+1, 10y, 10y+1。因為x和y同餘(同餘完全可以看作相等),所以10x與10y同餘,10x+1與10y+1同餘。也就是說由y擴充套件出來的子樹和由x擴充套件產生出來的子樹產生完全相同的餘數,如果x比y小,那麼y肯定不是滿足要求的最小的數,所以y這棵子樹可以被剪掉。這樣,2^k個數按照模n餘數分類,每類中只保留最小的那個數以供擴充套件。原來在這一層需要搜尋2^k個數,現在只需要搜尋o(n)個數。例如,當n=9時,第0層是1(1),
如上圖所示,第2層的110,第三層的1010、1110都因為同一層有和它同餘且更小的數而被剪掉。如果按照方法三搜尋,第三層本來應該有8個結點,但現在只有4個結點。
方法一的源**:
[cpp]view plain
copy
#include
inthasonlyoneandzero(unsigned
intn)
return
1;
} int
main()
} }
return
0;
}
方法三的源**:
[cpp]view plain
copy
// 解法三(1):廣度優先搜尋
#define _crt_secure_no_warnings 1
#include
#include
using
namespace
std;
intmain()
q.push(t * 10);
q.push(t * 10 + 1);
} }
return
0;
}
方法四源**:
[cpp]view plain
copy
// 解法四:將搜尋空間分過類的廣度搜尋,這樣空間占用是o(n)而不是
// 指數級。分類的原則是按照模n的餘數分類
#define _crt_secure_no_warnings 1
#include
#include
#include
#include
using
namespace
std;
struct
qnode
qnode(): v(0), r(0) {}
};
intmain()
q.pop();
if(!bn[t.r * 10 % n])
if(!bn[(t.r * 10 + 1) % n])
} }
ok:;
} return
0;
}
為什麼只看重結果 不要只看重結果,過程也是美麗的
我只看結果,不看過程,這句話在時下社會裡頗為常見,往往是領導對員工最為常見的一句話。生活中,一些人為達目的不擇手段,只要能得到預期的結果,哪會去在意過程如何?喜歡外出郊遊的朋友們,往往驅車千里到達目標景點,卻發現並不像預期那樣景色宜人,卻忘記了去欣賞沿途的無限風景。是的,結果很重要,但過程一樣美麗。...
生成兩數相乘結果的螺旋陣列
有人問到乙個演算法 兩數相乘,生成乙個螺旋陣列。舉例說明 3 4 生成的螺旋陣列為 1 2 3 4 10 11 12 5 9 8 7 6 5 6 生成的螺旋陣列為 1 2 3 4 5 6 18 19 20 21 22 7 17 28 29 30 23 8 16 27 26 25 24 9 15 14...
mysql修改查詢出來結果
需求 之前漢字轉拼音時候發覺有個字母 轉換錯了,應該是v才對,實際上 也沒錯,但是在計算機拼音中 是用v表示的,所以要把表中的 全部轉換為v 一開始覺得這個sql應該也不難,先查詢出來所有的符合條件的然後update 寫出來了發現報錯了。you can t specify target table ...