求:3^0 + 3^1 +…+ 3^(n) mod 1000000007
input
輸入乙個數n(0 <= n <= 10^9)
output
輸出:計算結果
sample input
3sample output
40【分析】
利用等比數列的求和公式得所求和是(3(n+1)-1)/2,如果暴力求3(n+1)會超時,這裡引入快速冪來加速。
思想類似這樣,比如求38,直接求的話就是8個3相乘,可以轉換成4個9相乘,繼續轉換成2個81相乘,這樣大大縮短了計算時間。而快速冪的思想,則是把冪當成二進位制數,依次進行右移位運算,大大減少了運算次數,比如求310,此時冪是10=1010(2),規定冪模2等於1即冪&1等於1時,右移1位運算,並乘進結果,計算310其實就是拆成了38和3^2這兩個數相乘,快速冪**具體實現結合本題如下示範:
【乘法逆元問題】
滿足ak=1(mod p)的k值就是a關於p的乘法逆元。
(a/b)mod p=(ak)mod p
關於逆元的求法後續部落格會補充,本題中的k=(1e9+7+1)/2
#includeusing namespace std;
const int mod=1e9+7;
long long mul(long long x,long long n)
return result;
}int main()
return ret;
}class matrix
void _copy(int*t)
return a.d[1][1];
}int main()
超時**2:
for(int i=1;i<=k;i++)
優化方法是利用遞迴的方式解決,列舉其中兩個和,比如(e是單位陣):
s(6)=a+a2+…+a6=(a+a2+a3)(e+a3)=s(3)*(e+a3)
s(7)=a+a2+…+a7=a+(a2+a3+a4)(e+a3)=a+s(3)(a+a^4)
通過觀察這兩個有代表性的前6、7項和,可以很快寫出遞迴求解前k項和的函式,可以有效解決tle
另外,注意本題用於運算的二維陣列矩陣,如果定義成long long會tle,要定義成int
ac**:
#include#includeusing namespace std;
int mod;
typedef struct
matrix;
matrix mul(matrix a,matrix b)
return c;
}matrix add(matrix a,matrix b)
result=solve(m,k);
for(int i=0;icout<}
return 0;
}
快速冪 矩陣快速冪
快速冪 正常情況下求乙個數的冪時間複雜度為o n 而快速冪能把時間複雜度降到o logn 舉個例子 求5的13次方 思想首先把13化為二進位制 1101,即13 1101 8 1 4 1 2 0 1 1 即5 13 58 1 54 1 52 0 5 1 15 5 8 1 5 4 1 5 2 0 5 ...
快速冪 矩陣快速冪
快速冪 我們求a ba b ab最直接的方法就是把a乘b次這樣的話複雜度就是o n o n o n 但是在比賽時面對1e9的資料時還是會輕鬆超時的,此時就需要一種更快的乘法來幫助我們 我們把b拆成二進位制的形式得到a ba b ab a 10.01 a a1 0.01此時對b分解得到的序列10.01...
快速冪 矩陣快速冪
如果要你自己寫乙個pow 函式,需要求2的2000000000次方,怎麼求?int pow int a,int b 上述 的時間複雜度是o n 當資料數量級很大的時候,這份 的耗時會非常巨大,並不能解決我們的問題。那我們該怎麼辦呢?以2的74次方為例,74的二進位制為1001010。對應的,我們得到...