Applese 涂颜色(欧拉定理降幂+快速幂)
鏈接:https://ac.nowcoder.com/acm/contest/330/E
來(lái)源:??途W(wǎng)
精通程序設(shè)計(jì)的 Applese 叕寫了一個(gè)游戲。
在這個(gè)游戲中,有一個(gè) n 行 m 列的方陣?,F(xiàn)在它要為這個(gè)方陣涂上黑白兩種顏色。規(guī)定左右相鄰兩格的顏色不能相同。請(qǐng)你幫它統(tǒng)計(jì)一下有多少種涂色的方法。由于答案很大,你需要將答案對(duì)
10
9
+
7
109+7 取模。
/*
這題容易發(fā)現(xiàn)規(guī)律,每一行有2種涂法(交叉式的涂),而跟有多少列沒(méi)有關(guān)系。
所以ans = 2^n%mod;
由于n特別大,所以這題重點(diǎn)就是高精度的計(jì)算。
高精度的 冪并且取模運(yùn)算 會(huì)想到用 歐拉定理降冪+快速冪。
對(duì)于歐拉定理,有個(gè)歐拉函數(shù):
定義:
在數(shù)論中,對(duì)于一個(gè)正整數(shù)n,歐拉函數(shù)是 小于等于n 的正整數(shù)中 與n互質(zhì)的數(shù) 的數(shù)目(φ(1)=1)。
關(guān)于歐拉函數(shù)與歐拉定理和費(fèi)馬小定理的關(guān)系:
歐拉定理的公式理解:
對(duì)于互質(zhì)數(shù)a,m, a 的 m的歐拉值 次冪 對(duì)m取模 與 1對(duì)m取模 同余(三橫這里是同余的意思)
費(fèi)馬小定理可以看成歐拉定理的一種特殊情況,即m為質(zhì)數(shù),對(duì)m取模時(shí),m的歐拉值為m-1;
那么如何運(yùn)用歐拉定理來(lái)降冪呢?
我們用歐拉定理的特殊情況費(fèi)馬小定理來(lái)舉例:
與測(cè)試結(jié)果一致:
/
/
解題:
由于mod = 1e9 + 7,
是一個(gè)質(zhì)數(shù),所以對(duì)于本題來(lái)說(shuō)可以直接用費(fèi)馬小定理+快速冪
或者不管mod是不是質(zhì)數(shù)(沒(méi)有考慮到mod是不是質(zhì)數(shù)),用歐拉定理+快速冪;
冪指數(shù)n十分十分大,用前先結(jié)合同余定理處理
*/
ac_code(費(fèi)馬+快速冪):
ac_code(歐拉+快速冪):
#include <iostream> #include <string> #define ll long long const ll mod = 1e9+7; using namespace std; ll quickPow(ll a,ll b) {ll ans = 1;a %= mod;while(b){if(b&1) ans = (ans * a) % mod;a = a * a % mod;b >>= 1;}return ans; } ll euler(ll n) {ll res = n;for(int i = 2; i*i <= n; i++){if(n % i == 0)res = res / i * (i-1);while(n%i==0)n /= i;}if(n > 1)res = res / n * (n-1);return res; } int main() {string s1,s2;while(cin>>s1>>s2){ll length = s1.size(),n = 0,p;//p = mod - 1;p = euler(mod);for(int i = 0; i < length; i++){n =(n * 10 + (s1[i] - '0')) % p;}cout<<quickPow(2,n)<<endl;}return 0; }總結(jié)
以上是生活随笔為你收集整理的Applese 涂颜色(欧拉定理降幂+快速幂)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 利用向量叉积求三角形的面积(+STL:n
- 下一篇: Applese 的回文串(加一个字符的回