UPC4247【数论】普通递归关系

妖精的绣舞 提交于 2019-11-27 10:47:17

【数论】普通递归关系

时间限制: 1 Sec  内存限制: 128 MB
提交: 103  解决: 19
[提交] [状态] [命题人:admin]

题目描述

考虑以下定义在非负整数 n 上的递归关系


其中 a,b 是满足以下两个条件的常数:
(1) a2+4b>0
(2) |a-sqrt(a2+4b)| <= 2 // sqrt 是根号的意思
给定 f0,f1, a, b 和 n,请你写一个程序计算f(n),可以假定f(n)是绝对值不超过 109 的整数 (四舍五入)。

 

输入

一行依次给出5个数,f0,f1,a,b和n,f0,f1是绝对值不超过109,n是非负整数,不超过109。另外,a、b是满足上述条件的实数,且|a|,|b|<=106。

 

输出

一个数F(n)

 

样例输入

0 1 1 1 20  

样例输出

6765一道水题,矩阵快速幂板子题,注意是duoble类型,而且注意神坑数据f1=f0=0
#include <bits/stdc++.h>  typedef long long ll;  using namespace std;  const int N=1e6+5;  struct mat  {      double a[2][2];            mat operator *(const mat &t)const      {          mat res;          for(int i=0;i<2;i++)          {              for(int j=0;j<2;j++)              {                  res.a[i][j]=0.0;                  for(int k=0;k<2;k++)                      res.a[i][j]=(res.a[i][j]+a[i][k]*t.a[k][j]);              }          }          return res;      }  };  mat qpow(mat a,ll b)  {      mat ans;      ans.a[0][0]=ans.a[1][1]=1;      ans.a[0][1]=ans.a[1][0]=0;      while(b)      {          if(b&1)ans=ans*a;          a=a*a;          b>>=1;      }      return ans;  }  int main()  {      ios::sync_with_stdio(false);      cin.tie(0);      double f1,f0,a,b;      ll n;      cin>>f0>>f1>>a>>b>>n;      if(f0==0&&f1==0)      {          cout<<0<<endl;          return 0;      }      mat A,B;      A.a[0][0]=a;      A.a[0][1]=b;      A.a[1][0]=1;      B.a[0][0]=f1;      B.a[1][0]=f0;      A=qpow(A,n-1)*B;      printf("%.0f\n",A.a[0][0]);      return 0;  }

 

 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!