• hdu 3306 Another kind of Fibonacci


    Another kind of Fibonacci

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
    Total Submission(s): 3509    Accepted Submission(s): 1401

    Problem Description

      As we all known , the Fibonacci series : F(0) = 1, F(1) = 1, F(N) = F(N - 1) + F(N - 2) (N >= 2).Now we define another kind of Fibonacci : A(0) = 1 , A(1) = 1 , A(N) = X * A(N - 1) + Y * A(N - 2) (N >= 2).And we want to Calculate S(N) , S(N) = A(0)2 +A(1)2+……+A(n)2

    Input

    There are several test cases.
    Each test case will contain three integers , N, X , Y .
    N : 2<= N <= 231 – 1
    X : 2<= X <= 231– 1
    Y : 2<= Y <= 231 – 1

    Output

    For each test case , output the answer of S(n).If the answer is too big , divide it by 10007 and give me the reminder.

    Sample Input

    2 1 1 3 2 3

    Sample Out

    6 196
     
    题意:多组数据。每组数据有N,X,Y,A(0)=1 ,A(1)=1 ,A(N)=X*A(N-1)+Y*A(N-2)(N >= 2),求S(N)=A(0)2+A(1)2+…+A(n)2  
     
    题解:利用A(N)=X*A(N-1)+Y*A(N-2),S(N)=S(N-1)+A(N)2,A(N)2=X2*A(N-1)2+2XY*A(N-1)A(N-2)+Y2*A(N-2)2构造矩阵。
     
          
     
     
     
      
     
     
    代码:
    #include<bits/stdc++.h>
    using namespace std;
    const int mod=10007;
    struct node
    {
      long long Martix[4][4];
      node operator *(const node&n) const
      {
        int i,j,k;node sum;
        for(i=0;i<4;i++)
         for(j=0;j<4;j++)
          {
            sum.Martix[i][j]=0;
            for(k=0;k<4;k++) 
              sum.Martix[i][j]=(sum.Martix[i][j]+Martix[i][k]*n.Martix[k][j])%mod;
          }
        return sum;
      }
    };
    int main()
    {
      long long n,x,y;
      node B,ans;
      while(~scanf("%lld%lld%lld",&n,&x,&y))
      {
        fill(B.Martix[0],B.Martix[0]+16,0);
        fill(ans.Martix[0],ans.Martix[0]+16,0);
        for(int i=0;i<4;i++) ans.Martix[i][i]=1;
        B.Martix[0][0]=B.Martix[1][0]=B.Martix[1][2]=1;
        B.Martix[1][1]=(x*x)%mod;
        B.Martix[2][1]=(y*y)%mod;
        B.Martix[3][1]=(2*x*y)%mod;
        B.Martix[1][3]=x%mod;
        B.Martix[3][3]=y%mod;
        while(n)
        {
           if(n&1) ans=ans*B;
           n>>=1;
           B=B*B;
        }
        printf("%lld
    ",(ans.Martix[0][0]+ans.Martix[1][0]+ans.Martix[2][0]+ans.Martix[3][0])%mod);
      }
      system("pause");
      return 0;
    }
    本博客仅为本人学习,总结,归纳,交流所用,若文章中存在错误或有不当之处,十分抱歉,劳烦指出,不胜感激!!!
  • 相关阅读:
    .NET Core自定义TagHelper和使用Serilog
    .NET Core CSRF
    jq 获取表单全部数据
    Webuploader 简单图片上传 支持多图上传
    CF-1451 E Bitwise Queries 异或 交互题
    CF-1440C2 Binary Table (Hard Version) (构造,模拟)
    CF-1445 C
    ACM模板_axiomofchoice_extra
    Codeforces Round #678 (Div. 2) 题解 (A-E)
    Oracle数据同步
  • 原文地址:https://www.cnblogs.com/VividBinGo/p/11323175.html
Copyright © 2020-2023  润新知