题目链接:https://www.luogu.org/problemnew/show/P1962

题意:求fib数列的第n项,很大。mod 1e9+7.

题解:BM直接推。

代码:

 #include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <cassert>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long ll;
typedef pair<int, int> PII;
const ll mod = ;
ll powmod(ll a, ll b)
{
ll res = ; a %= mod;
assert(b >= );
for (; b; b >>= )
{
if (b & )
res = res * a%mod;
a = a * a%mod;
}
return res;
}
// head int _, n;
namespace linear_seq
{
const int N = ;
ll res[N], base[N], _c[N], _md[N];
vector<int> Md;
void mul(ll *a, ll *b, int k)
{
rep(i, , k + k) _c[i] = ;
rep(i, , k)
if (a[i])
rep(j, , k)
_c[i + j] = (_c[i + j] + a[i] * b[j]) % mod;
for (int i = k + k - ; i >= k; i--)
if (_c[i])
rep(j, , SZ(Md))
_c[i - k + Md[j]] = (_c[i - k + Md[j]] - _c[i] * _md[Md[j]]) % mod;
rep(i, , k) a[i] = _c[i];
}
int solve(ll n, VI a, VI b) { // a 系数 b 初值 b[n+1]=a[0]*b[n]+...
// printf("%d\n",SZ(b));
ll ans = , pnt = ;
int k = SZ(a);
assert(SZ(a) == SZ(b));
rep(i, , k)
_md[k - - i] = -a[i]; _md[k] = ;
Md.clear();
rep(i, , k)
if (_md[i] != ) Md.push_back(i);
rep(i, , k)
res[i] = base[i] = ;
res[] = ;
while ((1ll << pnt) <= n) pnt++;
for (int p = pnt; p >= ; p--)
{
mul(res, res, k);
if ((n >> p) & )
{
for (int i = k - ; i >= ; i--) res[i + ] = res[i]; res[] = ;
rep(j, , SZ(Md)) res[Md[j]] = (res[Md[j]] - res[k] * _md[Md[j]]) % mod;
}
}
rep(i, , k) ans = (ans + res[i] * b[i]) % mod;
if (ans < ) ans += mod;
return ans;
}
VI BM(VI s)
{
VI C(, ), B(, );
int L = , m = , b = ;
rep(n, , SZ(s))
{
ll d = ;
rep(i, , L + ) d = (d + (ll)C[i] * s[n - i]) % mod;
if (d == ) ++m;
else if ( * L <= n)
{
VI T = C;
ll c = mod - d * powmod(b, mod - ) % mod;
while (SZ(C) < SZ(B) + m) C.pb();
rep(i, , SZ(B)) C[i + m] = (C[i + m] + c * B[i]) % mod;
L = n + - L; B = T; b = d; m = ;
}
else
{
ll c = mod - d * powmod(b, mod - ) % mod;
while (SZ(C) < SZ(B) + m) C.pb();
rep(i, , SZ(B)) C[i + m] = (C[i + m] + c * B[i]) % mod;
++m;
}
}
return C;
}
int gao(VI a, ll n)
{
VI c = BM(a);
c.erase(c.begin());
rep(i, , SZ(c)) c[i] = (mod - c[i]) % mod;
return solve(n, c, VI(a.begin(), a.begin() + SZ(c)));
}
}; int main() {
long long n;
vector<int>v;
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
while(~scanf("%lld",&n)){
printf("%lld\n", linear_seq::gao(v, n - ));
//VI{1,2,4,7,13,24}
//printf("%lld\n", linear_seq::gao(v, n - 1));
//printf("%d\n",linear_seq::gao(VI{x1,x2,x3,x4},n-1));
}
}

update:

矩阵快速幂

\begin{pmatrix} 1 & 1\\ 1 & 0 \end{pmatrix}  *

\begin{pmatrix} f(n-1)\\ f(n-2) \end{pmatrix} =

\begin{pmatrix} f(n)\\ f(n-1) \end{pmatrix}

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define ll long long
const int maxn = ;
const ll mod = 1e9+; ll n,p; //矩阵结构体
struct Matrix{
ll a[maxn][maxn];
void init(){ //初始化为单位矩阵
memset(a, , sizeof(a));
for(int i = ; i <= maxn;i++){
a[i][i] = ;
}
}
}; //矩阵乘法
Matrix mul(Matrix a, Matrix b){
Matrix ans;
for(int i = ;i <= ;++i){
for(int j = ;j <= ;++j){
ans.a[i][j] = ;
for(int k = ;k <= ;++k){
ans.a[i][j] = ans.a[i][j] % mod + a.a[i][k] * b.a[k][j] % mod;
}
}
}
return ans;
} //矩阵快速幂
Matrix qpow(Matrix a,ll b){
Matrix ans;
ans.init();
while(b){
if(b & )
ans = mul(ans,a);
a = mul(a,a);
b >>= ;
}
return ans;
} void print(Matrix a){
for(int i = ; i <= n;++i){
for(int j = ;j <= n;++j){
cout << a.a[i][j]%mod<< " ";
}
cout << endl;
}
} int main(){
Matrix base;
Matrix ans;
ans.a[][] = ;
ans.a[][] = ;
base.a[][] = ;
base.a[][] = ;
base.a[][] = ;
base.a[][] = ;
cin>>n;
ans = mul(ans,qpow(base,n-));
cout<<ans.a[][]<<endl;
return ;
}

【洛谷】P1962的更多相关文章

  1. 洛谷P1962 斐波那契数列【矩阵运算】

    洛谷P1962 斐波那契数列[矩阵运算] 题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) ( ...

  2. 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]

    P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ...

  3. 洛谷 P1962 斐波那契数列

    题目链接:https://www.luogu.org/problemnew/show/P1962 题目大意: 略 分析: 由于数据规模很大,需要用矩阵快速幂来解. 代码如下: #pragma GCC ...

  4. 【洛谷P1962】斐波那契数列

    斐波那契数列 题目链接:https://www.luogu.org/problemnew/show/P1962 矩阵A 1,1 1,0 用A^k即可求出feb(k). 矩阵快速幂 #include&l ...

  5. 洛谷——P1962 斐波那契数列

    P1962 斐波那契数列 题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 ...

  6. 题解——洛谷P1962 斐波那契数列(矩阵乘法)

    矩阵乘法加速线性递推的典型 大概套路就是先构造一个矩阵\( F \)使得另一初始矩阵\( A \)乘以\( F^{x} \)能够得出第n项 跑的飞快 虽然我也不知道那个矩阵要怎么构造 或许就像我使用了 ...

  7. AC日记——斐波那契数列 洛谷 P1962

    斐波那契数列 思路: 矩阵快速幂: 来,上代码: #include <cstdio> #include <cstring> #include <iostream> ...

  8. 洛谷P1962 斐波那契数列

    传送门 不难得到状态转移矩阵 然后带进去乱搞 //minamoto #include<iostream> #include<cstdio> #include<cstrin ...

  9. 洛谷—— P1962 斐波那契数列

    https://www.luogu.org/problem/show?pid=1962 题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f ...

  10. 洛谷P1962 斐波那契数列(矩阵快速幂)

    题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数) 题目描述 请 ...

随机推荐

  1. date和string转换用joda包

    import org.joda.time.DateTime;import org.joda.time.format.DateTimeFormat;import org.joda.time.format ...

  2. 51nod1787最大子方阵

    51nod1787最大子方阵 我在51nod上面切的第一道题 我在51nod上面切的第一道8级题 我在51nod上面切的第一道8级题的一血 题目大意 有一个n*m的矩阵,矩阵中的每一个元素是'X'或者 ...

  3. 二维RMQ hdu 2888

    题目:点这里 题意:给出一个n*m的矩阵,然后又Q个询问:每个询问有x1,y1,x2,y2,x1,y1为子矩阵的左上角坐标,x2,y2为右上角的坐标.求此子矩阵中元素最大值,判断最大值是否在子矩阵四个 ...

  4. span里面插入文字

    .text-box span::before{   content:attr(data-text);}

  5. Pregel 消息传递机制

  6. JS window对象 History 对象 history对象记录了用户曾经浏览过的页面(URL),并可以实现浏览器前进与后退相似导航的功能。语法: window.history.[属性|方法]

    History 对象 history对象记录了用户曾经浏览过的页面(URL),并可以实现浏览器前进与后退相似导航的功能. 注意:从窗口被打开的那一刻开始记录,每个浏览器窗口.每个标签页乃至每个框架,都 ...

  7. 在windows server 2012中安装完oracle 11 client如何使用

    1.首先要添加监听配置,这样才可以没有报错的连接上服务器,至于如何添加,请自行搜索. 2.打开SQL  Plus连接oracle server端,这里因为是小白,看到命令行界面上来就需要输入用户名密码 ...

  8. thrift 的一些相关知识

    thrift是一个很好用的跨语言的rpc框架. 但是其也有一些需要注意的问题: 第一: 发现其对于类型检查没有那么严格:    最近工作中发现是可以把一个int类型直接付给string,而没有任何wa ...

  9. 【ZJOI2007】捉迷藏

    题面 Description Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子. 某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏. 他们的家很大且构造很奇特,由N个屋子和N-1条 ...

  10. jq-demo-点击改变图片

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...