n=2000000000)
每組測試資料報括一行,x(0輸入可能有多組資料,對於每一組資料,root(x^y, k)的值
4 4 10
4
這道題乍一看好像沒有什麼思路,那就先暴力求解試試。不過不管你用pow函式,還是用快速冪運算,都過不了,因為結果已經爆long long int。有關快速冪運算這裡簡單提一下,不清楚的可以自行google。
快速冪運算是用來計算形如xy這種式子的一種快速方法,核心在於將指數y表示為二進位制的形式,並將計算拆分為x2
n這種形式,這樣在計算後乙個指數運算時,可以利用前面的計算結果,減少了計算量,加快了運算速度。
這道題暴力解決不了,只能想其他方法,考慮到這可能是乙個數學問題,如果我們能夠找出其中的規律,就能迎刃而解。題目說n』是n的k進製數字之和,那麼可以首先將n用k進製表示出來。
設a0,a1,…,an分別為kn的係數
那麼n = a0 + a1k + a2k2 + … + ankn
根據題意n』 = a0 + a1 + … + an,兩式相減
n - n』 = a1(k-1) + a2(k2-1) + … + an(kn-1),兩邊同時模k-1
n - n』 % (k-1) = 0,繼續遞推下去
n』 - n』』 % (k-1) = 0,
…n(i-1) - n(i) % (k-1) = 0,進行累加
n - n(i) % (k-1) = 0,移項
n(i) = n % (k-1),n(i)即為我們所求值,n(i) < k
上面的推導過程使用了模運算的性質,如果有不清楚的地方,可以學習一下模運算。模運算在數學題中很常見,也需要掌握。
這樣我們就得到了上面的公式,因為在運算過程中取模,所以不會爆int。另外還需要注意邊界條件,n(i) = 0的情況下,實際應該輸出k-1。因為如果xy不為0,那麼結果一定不會為0。在實際程式設計中使用了快速模冪運算,其實就是在快速冪運算的基礎上進行改進,在每一步的運算過程中都進行取模運算,這個演算法也是需要掌握的。
#include
using namespace std;
intfunc
(long
long
int x,
long
long
int y,
int k)
//快速模冪運算模板
x =(x*x)
% k;
//每次需要增大基數
y >>=1;
//y右移一位,相當於除以2
}return result;
}int
main
(void
)else
}return0;
}
清華大學考研複試機試 abc
設a b c均是0到9之間的數字,abc bcc是兩個三位數,且有 abc bcc 532。求滿足條件的所有a b c的值。題目沒有任何輸入。請輸出所有滿足題目條件的a b c的值。a b c之間用空格隔開。每個輸出佔一行。水題,直接遍歷暴力求解即可,三層for迴圈。不過也有一些優化的點,可能優化效...
清華大學考研複試機試 進製轉換
將乙個長度最多為30位數字的十進位製非負整數轉換為二進位制數輸出。多組資料,每行為乙個長度不超過30位的十進位製非負整數。注意是10進製數字的個數可能有30個,而非30bits的整數 每行輸出對應的二進位制數。此題為大數轉換問題,通過模擬手工計算過程來實現。清華大學的考研複試機試經常為考察大整數問題...
清華大學考研複試機試 進製轉換2
將m進製的數x轉換為n進製的數輸出。輸入的第一行包括兩個整數 m和n 2 m,n 36 下面的一行輸入乙個數x,x是m進製的數,現在要求你將m進製的數x轉換成n進製的數輸出。輸出x的n進製表示的數。10 2 111011輸入時如有字母,則字母為大寫,輸出時如有字母,則字母為小寫。這道題其實和10進製...