Fibonacci前n项和 (矩阵乘)

大家知道Fibonacci数列吧, f[1]=1, f[2]=1, f[3]=2, f[4]=3…, 也就是f[n]=f[n-1]+f[n-2],现在问题很简单,输入n和m,求前n项和取模m。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <cstring>
#include <cstdlib>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <cmath>
using namespace std;
#define mem(s,t) memset(s,t,sizeof(s))
#define pq priority_queue
#define pb push_back
#define fi first
#define se second
#define ac return 0;
#define ll long long
#define TLE std::ios::sync_with_stdio(false);   cin.tie(NULL);   cout.tie(NULL);   cout.precision(10);
string str;
set <int> id;
int cnt[30000+10];
vector <int> edge[30000+10];
//pq<int , vector<int> ,greater<int> >q;
pq<int>q;
vector <int> ans;
const int maxn = 4;
struct mat
{
    int m[maxn][maxn];
}  unit;
mat operator * (mat a,mat b)
{
    mat ret;
    ll sum;
    for(int i=1; i<=3; i++)
        for(int j=1; j<=3; j++)
        {
            sum = 0;
            for(int k=1; k<=3; k++)
                sum += (ll)a.m[i][k]*b.m[k][j];
            ret.m[i][j] = sum;
        }
    return ret;
}
void init_unit()
{
    for(int i=1; i<=3; i++)
        for(int j=1; j<=3; j++)
        {
            if(i==j) unit.m[i][i] = 1 ;
            else unit.m[i][j] = 0;
        }
}
mat MultiPow(mat arr,ll n)
{
    mat ret=unit;
    while(n)
    {
        if(n&1)
            ret = ret*arr;
        n>>=1;
        arr=arr*arr;
    }
    return ret;
}
int main()
{
    TLE;
    int k,n;
    cin>>n>>k;
    init_unit();
    mat arr=unit;
    arr.m[1][2]=1;    arr.m[3][2]=1;
    arr.m[3][3]=0;    arr.m[2][3]=1;
    arr=MultiPow(arr,n-1);
    ll ans=0;
    for(int i=1; i<=3; i++)
        ans+=arr.m[1][i];
    cout<<ans%k<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/Shallow-dream/p/11683326.html

时间: 2024-08-27 07:21:01

Fibonacci前n项和 (矩阵乘)的相关文章

Fibonacci 第 n 项及Fibonacci 前 n 项和

这其实是两道题目,但是他们量都题目的思路是在是相像,而且炒鸡厉害. Fibonacci 第 n 项 题目描述 大家都知道 Fibonacci 数列吧,f1=1,f2=1,f3=2,f=3...fn=fn-1+fn-2, f1=1,f2=1,f3=2,f4=3,-,fn=fn?1+fn?2. 现在问题很简单,输入 n 和 m,求 fn mod m 输入格式 输入 n,m. 输出格式 输出 fn mod m 样例输入 5 1000 样例输出 5 Fibonacci 前 n 项和 题目描述 大家都知道

常系数线性递推的第n项及前n项和 (Fibonacci数列,矩阵)

(一)Fibonacci数列f[n]=f[n-1]+f[n-2],f[1]=f[2]=1的第n项的快速求法(不考虑高精度). 解法: 考虑1×2的矩阵[f[n-2],f[n-1]].根据fibonacci数列的递推关系,我们希望通过乘以一个2×2的矩阵,得到矩阵[f[n-1],f[n]]=[f[n-1],f[n-1]+f[n-2]] 很容易构造出这个2×2矩阵A,即: 0 1 1 1 所以,有[f[1],f[2]]×A=[f[2],f[3]] 又因为矩阵乘法满足结合律,故有: [f[1],f[2

hdu4686 简单的矩阵快速幂求前n项和

HDU4686 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4686 题意:题目说的很清楚了,英语不好的猜也该猜懂了,就是求一个表达式的前n项和,矩阵快速幂一般多加一行一列来完成这个加的操作.具体看代码吧.比较简单,唯一有一点坑的地方,就是ax和bx可能比较大,在求ax*bx的时候,要考虑溢出的问题,需要先mod.其他没有了,直接看代码吧! //Author: xiaowuga #include <bits/stdc++.h> #define

Tribonacci(泰波那契)数列前n项和的求解问题

 Tribonacci数列是斐波那挈数列的扩展  很有趣的,我们可以发现  这是Tribonacci数列的一些深入研究 下面是贴代码的时间了: 解法一(半产品) 这种方法就不解释了,不懂就去看看最笨的方法递归求解,而这是对递归求解的优化 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); wh

求f(k)=k^k(k=1...n)的前n项和

求f(k)=k^k(k=1...n)的前n项和. 程序实现: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> long long My_Mul_Sum(int *n)//封装了一个求k^k的前n项和的函数 { int k = 1; long long sum = 0;//定义为long long是为了防止数据较大,容易溢出 for (k = 1; k <= n; k++) { int count = 0, mul = 1;//count

2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。

package com.hanqi; public class Qiuhe { public static void main(String[] args) { // TODO 自动生成的方法存根 double sum=0,fenshu=0,a=1,b=2,c=0; for (int i = 0; i < 20; i++) { fenshu=b/a; c=a; a=b; b=a+c; sum+=fenshu; //System.out.println(fenshu); } System.out.

循环-26. 求给定序列前N项和之四

循环-26. 求给定序列前N项和之四(15) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 来源 ZOJ 本题要求编写程序,计算序列 1 - 1/4 + 1/7 - 1/10 + ... 的前N项之和. 输入格式: 输入在一行中给出一个正整数N. 输出格式: 在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后3位.题目保证计算结果不超过双精度范围. 输入样例: 10 输出样例: sum = 0.819 1 #incl

循环-21. 求交错序列前N项和

1 /* 2 * Main.c 3 * C21-循环-21. 求交错序列前N项和 4 * Created on: 2014年8月18日 5 * Author: Boomkeeper 6 ***********测试通过******** 7 */ 8 9 #include <stdio.h> 10 11 int main(void){ 12 13 float numerator = 1; 14 float denominator = 1; 15 16 int N = 0;//前N项和 17 flo

有一分数序列: 2/1 3/2 5/3 8/5 13/8 21/13...... 求出这个数列的前N项之和,保留两位小数。

题目描述 输入 N 输出 数列前N项和 样例输入 10 样例输出 16.48 代码:#include<stdio.h>int main(){    int i,N;    double c=0,a=2.0,b=1.0,t,sum=0;         scanf("%d",&N);    for(i=0;i<N;i++)    {           c=a/b;        sum=sum+c;        t=a;        a=a+b;