一,快速冪:取冪指數的二進位制,從低到高尋找,當前位= 1時,加上當前位對應的值,複雜度順利降到o(logn)
//b=1000001101(二進位制)
//a^b=a^0+a^2+a^3+a^9
//o(log2(b))
typedef long long ll;
ll qpow(ll a,ll b) //a^b
return res;
}
二,矩陣快速冪:變遞推加法為矩陣冪的形式,推出矩陣直接套板子即可
const int mod=1e9+7;
typedef long long ll;
struct pl;
pl mul(pl a,pl b)
return res;
}
三,試試板子能不能用
1,斐波那契數列,求第n項值(mod 1e9+7);
#include using namespace std;
const int mod=1e9+7;
typedef long long ll;
struct pl p;
pl mul(pl a,pl b)
} }return res;
}pl qpow(pl a,ll k)
return res;
}//[f(n-1),f(n-2)] * 矩陣a = [f(n),f(n-1)]
//故f(n) = a^(n-2) * [f(2),f(1)]
void init()
ll solve(ll n)
}int main()
return 0;
}
2,再來個超級麻煩的:f(n)=f(n-1)+f(n-2)*2+n^4;
#include #include using namespace std;
typedef long long ll;
const int mod = 2147493647;
struct pl;
pl p=;
pl work(pl work,pl y) //矩陣乘法}}
return box;
}pl fastpow(pl b,ll kk) //快速冪
return ans;
}int main()
if(n==2)
pl pp=fastpow(p,n-2);
ll ans=pp.a[0][0]*b%mod;
ans=(ans+pp.a[1][0]*a%mod)%mod;
ans=(ans+pp.a[2][0]*16%mod)%mod;
ans=(ans+pp.a[3][0]*8%mod)%mod;
ans=(ans+pp.a[4][0]*4%mod)%mod;
ans=(ans+pp.a[5][0]*2%mod)%mod;
ans=(ans+pp.a[6][0]*1%mod)%mod;
printf("%lld\n",ans);
} return 0;
}
水不動了,先咕著自己,咕咕咕,,,, C 演算法篇 快速冪
讓我們先來思考乙個問題 7的10次方,怎樣算比較快?方法1 最樸素的想法,7 7 49,49 7 343,一步一步算,共進行了9次乘法。這樣算無疑太慢了,尤其對計算機的cpu而言,每次運算只乘上乙個個位數,無疑太屈才了。這時我們想到,也許可以拆分問題。方法2 先算7的5次方,即7 7 7 7 7,再...
快速冪水題 計數(數論)
求 a 的 b 次方,即 但是我們知道,當求到 所以,根據這個式子,可以列出遞迴 long long mod 模數 templatet long long qkpow long long a,t b 給定n,m,k都是小於10001的正整數,輸出給定的n個數中,其m次冪能被k整除的數的個數。輸出滿足...
快速冪 普通快速冪 矩陣快速冪
題意 n個人排隊,f表示女,m表示男,包含子串 fmf 和 fff 的序列為o佇列,否則為e佇列,有多少個序列為e佇列。分析 矩陣快速冪入門題。下面引用巨巨解釋 用f n 表示n個人滿足條件的結果,那麼如果最後乙個人是m的話,那麼前n 1個滿足條件即可,就是f n 1 如果最後乙個是f那麼這個還無法...