首页 > 其他分享 >佳佳的 Fibonacci

佳佳的 Fibonacci

时间:2024-03-13 15:46:40浏览次数:18  
标签:佳佳 题解 times int Fibonacci getchar

题面

\(f_x=\begin{cases} 1&x\in\{1,2\}\\ f_{x-1}+f_{x-2}&x \geq 3\\ \end{cases}\)

求 \(1\times f_1+2\times f_2+3\times f_3+…+n\times f_n\) 。

解法

正常的Fibonacci 前 n 项和

步入正题

再看这个发现就是变个形而已。

在已知 \(s_n=f_{n+2}-1\) 的前提下,可以极其简单的切了这道题。

原式

\(=s_n+s_n-s_{1}+s_n-s_{2}+…+s_n-s_{n-1}\)

\(=n\times s_n-\sum\limits_{i=1}^{n-1}s_i\)

\(=n\times s_n-\sum\limits_{i=3}^{n+1}f_{i}-1(∵ s_i=f_{i+2}-1)\)

\(=n\times s_n-(s_{n+1}-s_2-(n+1-3+1))\)

\(=n\times s_n-s_{n+1}+s_2+n-1\)

好的问题解决。

至于 \(s_n\) 的求法有很多种,用哪一种都可以,见上面的题解。

代码如下

#include<bits/stdc++.h>
#define int long long 
#define endl '\n'
using namespace std;
const int N=10;
template<typename Tp> inline void read(Tp&x)
{
    x=0;register bool z=true;
    register char c=getchar();
    for(;c<'0'||c>'9';c=getchar()) if(c=='-') z=0;
    for(;'0'<=c&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
    x=(z?x:~x+1);
}
int n,P,ans[N][N],c[N][N],a[N][N],ans1,ans2;
void qpow(int b)
{
    for(;b;b>>=1)
    {
        if(b&1)
        {
            for(int i=1;i<=2;i++)   
                for(int j=1;j<=2;j++)
                    for(int k=1;k<=2;k++)
                        (c[i][j]+=(ans[k][j]*a[i][k])%P)%P;
            for(int i=1;i<=2;i++)
                for(int j=1;j<=2;j++)   
                    ans[i][j]=c[i][j],c[i][j]=0;
        }
        for(int i=1;i<=2;i++)
            for(int j=1;j<=2;j++)
                for(int k=1;k<=2;k++)
                    (c[i][j]+=(a[i][k]*a[k][j])%P)%P;
        for(int i=1;i<=2;i++)
            for(int j=1;j<=2;j++)
                a[i][j]=c[i][j],c[i][j]=0;
    }
}
signed main()
{
	#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif
    read(n),read(P);
    a[1][1]=1;
    a[2][1]=1;
    a[1][2]=1;
    a[2][2]=0;
    for(int i=1;i<=2;i++)
        ans[i][i]=1;
    qpow(n+1);
    ans1=(ans[2][1]+ans[2][2]-1)%P;
    ans2=(ans[1][1]+ans[1][2]-1)%P;
    cout<<((n*ans1)%P-ans2+2+n-1)%P;
}

标签:佳佳,题解,times,int,Fibonacci,getchar
From: https://www.cnblogs.com/Charlieljk/p/18070769

相关文章

  • P9825 [ICPC2020 Shanghai R] Fibonacci
    原题链接题解直观的\(O(n)\)算法很容易想到,但是很不幸,挂了所以我们要想到\(O(1)\)的做法考虑到斐波那契数列非常有规律,所以我们找找规律奇,奇,偶,奇,奇,偶。。。code#include<bits/stdc++.h>usingnamespacestd;#definelllonglonglla[5]={0};intmain(){lln......
  • CF1264F Beautiful Fibonacci Problem
    一道比较Beautiful的结论题,初始感觉难以下手,做了后认为在CF3500中不算很难的(逃看到题目中“后18位的子串”,很明显的,我们要求一下Fibonacci数列${mod}10^k$的循环节。实践打表证明这个循环节为$1.5*10^k$但是我们需要一个随Fibonacci下标线性增加,$mod10^k$的值也线性增加的......
  • 2019年-fibonacci数列与黄金分割
    目录题目法一、递归法二、迭代题目法一、递归deffib(n):ifn==1orn==2:return1returnfib(n-1)+fib(n-2)n=int(input())a=fib(n)b=fib(n+1)print("{:.8f}".format(a/b))只通过了60%的测试法二、迭代#动态规划#deffib(n):#dp=[0]*(n+1)#......
  • 打印 Fibonacci 数列:
    #include<stdio.h> voidfibonacci(intn){   inti,num1=0,num2=1,nextNum;      printf("Fibonacciseriesupto%dterms:\n",n);      for(i=1;i<=n;++i){       printf("%d,",num1);       nextNum=num1+......
  • CodeForces 946F Fibonacci String Subsequences
    洛谷传送门CF传送门duel的时候差点不会2400了。套路地,考虑每个\(F(x)\)中与\(s\)相同的子序列的贡献。设这个子序列为\(F(x)_{p_1},F(x)_{p_2},F(x)_{p_3},\ldots,F(x)_{p_n}\)。我们想要它成为一个子序列的子串,那么\(F(x)_{[p_1,p_n]}\)中除了\(p_1\simp_......
  • 【题解】Fibonacci-ish II
    传送门题目分析根据题目范围\(n\le30000\)并且此题可以离线维护这个很恶心的东西,所以我们考虑莫队。由于要求访问到任意一个区间都要求知道它有序之后的序列,所以这个东西可以用权值线段树维护。因此,此题正解是莫队+权值线段树。我们分类讨论一下加上一个数,删除一个数对答案......
  • Go - Fibonacci
    fibonacci.gopackagealgorithms//DynamicProgrammingfuncFibonacci1(nint)int{ifn<=0{return0}ifn<=2{return1}previous1:=1previous2:=1currentVal:=0fori:=3;i<=n;......
  • F. Fibonacci Additions
     题意:给两个长度相同的数组,给出q次操作,a操作时对于a中的l与r,l项加上斐波那契的第一项,l+1加第二项,以此类推。b操作把前文中a数组改为b即可。操作完输出yes或no,表示操作后两个数组值在模mod后是否相同。做法:考虑斐波那契原有的性质,fn=fn-1+fn-2,所以对于a操作,如果n在闭区间[l+1,r......
  • Go - A Tour of Go Exercise: Fibonacci closure
    packagemainimport"fmt"//fibonacciisafunctionthatreturns//afunctionthatreturnsanint.funcfibonacci()func()int{f0,f1:=0,1returnfunc()int{f:=f0f0,f1=f1,f+f1returnf}}......
  • J Fibonacci Cane
    湖南省第十八届大学生计算机程序设计竞赛(HNCPC2022)J题原题链接:https://cpc.csgrandeur.cn/csgoj/problemset/problem?pid=1198没错,这个题是签到题:判断斐波那契区间有没有一段的和等于n,由于n≤1e15,所以直接暴力求解。题解代码如下#include<iostream>usingnamespacestd;ty......