。因此,從已經解決它的人那裏領導,我在python中編寫了下面的代碼。解釋這一算法
################################################
### http://www.codechef.com/problems/TAPALIN ###
################################################
def pow(b,e,m):
r=1
while e>0:
if e%2==1:
r=(r*b)%m
e=e>>1
b=(b*b)%m
return r
def cal(n,m):
from math import ceil
c=280000002
a=pow(26, int(ceil(n/2)), m)
if(n%2==0):
return ((52*(a-1+m)%m)*c)%m
else:
return ((52*(((a-1+m)*c)%m))%m+(a*26)%m)%m
c=int(raw_input())
m=1000000007
for z in range(c):
print cal(int(raw_input()),m)
pow的功能是Right-to-left binary method。我不明白的是:
- 280000002從哪裏來的?
- 爲什麼我們需要執行如此多的mod操作?
- 這是一些我不知道的着名算法?
幾乎每個在codechef上提交的代碼都使用這個算法,但我無法破譯它的工作。任何理論的鏈接將不勝感激。
我仍然無法弄清楚究竟發生了什麼。 任何人都可以爲這個公式/算法寫一個僞代碼嗎?也幫助我瞭解此代碼的時間複雜性。這讓我吃驚的另一件事是,如果我寫這個代碼:
################################################
### http://www.codechef.com/problems/TAPALIN ###
################################################
def modular_pow(base, exponent):
result=1
while exponent > 0:
if (exponent%2==1):
result=(result * base)%1000000007
exponent=exponent >> 1
base=(base*base)%1000000007
return result
c=int(raw_input())
from math import ceil
for z in range(c):
n=int(raw_input())
ans=modular_pow(26, int(ceil(n/2)))
if(n%2==0):
print ((52*((ans)-1+ 1000000007)%1000000007)*280000002)%1000000007
else:
print ((52*((((ans)-1+ 1000000007)*280000002)%1000000007))%1000000007+(ans*26)%1000000007)%1000000007
這改善了從0.6secs到0.4秒性能。儘管最好的代碼在0.0秒內運行。我非常困惑。
感謝您的信息。肯定地(52 *(a-1 + m)%m)=(52 *(a-1)%mi在如此之多的操作之間如此混亂,以至於我從未想到過,儘管這不是一個巨大的提升,這兩個代碼在0.6秒內執行都是正確的。 – whizzzkid 2013-03-26 07:29:02