nyoj301 递推求值
来源:互联网 发布:民航票务系统c语言 编辑:程序博客网 时间:2024/04/20 12:43
递推求值
时间限制:1000 ms | 内存限制:65535 KB
难度:4
- 描述
给你一个递推公式:
f(x)=a*f(x-2)+b*f(x-1)+c
并给你f(1),f(2)的值,请求出f(n)的值,由于f(n)的值可能过大,求出f(n)对1000007取模后的值。
注意:-1对3取模后等于2
- 输入
- 第一行是一个整数T,表示测试数据的组数(T<=10000)
随后每行有六个整数,分别表示f(1),f(2),a,b,c,n的值。
其中0<=f(1),f(2)<100,-100<=a,b,c<=100,1<=n<=100000000 (10^9) - 输出
- 输出f(n)对1000007取模后的值
- 样例输入
21 1 1 1 0 51 1 -1 -10 -100 3
样例输出
5
999896
这题可以用矩阵快速幂做,构造矩阵【f(x-2),f(x-1),c 】*A=【f(x-1),f(x),c】.
0 a 0
A= 1 b 0
0 1 1
#include<iostream>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#include<vector>#include<map>#include<set>#include<queue>#include<stack>#include<string>#include<algorithm>using namespace std;typedef long long ll;#define inf 0x7fffffff#define pi acos(-1.0)#define MOD 1000007ll ans[3][3];ll a,b;ll fast_mod(ll n){ ll i,j,k; ll t[3][3]={0,a,0,1,b,0,0,1,1}; ll temp[3][3]; while(n) { if(n&1){ for(i=0;i<3;i++){ for(j=0;j<3;j++){ temp[i][j]=ans[i][j]; ans[i][j]=0; } } for(i=0;i<3;i++){ for(j=0;j<3;j++){ for(k=0;k<3;k++){ ans[i][j]=(ans[i][j]+(temp[i][k]*t[k][j]%MOD) )%MOD; } ans[i][j]=(ans[i][j]+MOD)%MOD; } } } for(i=0;i<3;i++){ for(j=0;j<3;j++){ temp[i][j]=t[i][j]; t[i][j]=0; } } for(i=0;i<3;i++){ for(j=0;j<3;j++){ for(k=0;k<3;k++){ t[i][j]=(t[i][j]+(temp[i][k]*temp[k][j]%MOD) )%MOD; } t[i][j]=(t[i][j]+MOD)%MOD; } } n>>=1; }}int main(){ ll n,m,i,j,T,k; ll c,d,e; ll f[3]; scanf("%lld",&T); while(T--) { scanf("%lld%lld%lld%lld%lld%lld",&f[1],&f[2],&a,&b,&c,&n); if(n==1 || n==2){ printf("%lld\n",(f[n]+MOD)%MOD ); continue; } memset(ans,0,sizeof(ans)); ans[0][0]=ans[1][1]=ans[2][2]=1; fast_mod(n-1); ll cnt; //最后的一次矩阵可以直接算 cnt=( (f[1]*ans[0][0]+f[2]*ans[1][0]+c*ans[2][0])%MOD+MOD)%MOD; printf("%lld\n",cnt); } return 0;}
0 0
- nyoj301 递推求值
- NYOJ301-递推求值
- nyoj301递推求值
- nyoj301递推求值【矩阵快速幂】
- nyoj301——递推求值
- 【矩阵快速幂】nyoj301 递推求值
- NYOJ301 递推求值(矩阵快速幂)
- nyoj301-递推求值(矩阵模乘)
- nyoj301 递推求值(矩阵快速幂)
- NYOJ301递推求值 NYOJ 1000又见斐波那契数列(矩阵快速幂)
- acm-递推求值
- 蓝桥杯 递推求值
- 递推求值
- 递推求值
- 蓝桥杯-递推求值
- 递推求值
- 递推求值
- nyoj 301 递推求值
- cv::Mat到YUV420的转换
- 正则表达式
- Android——遇故障时重启应用
- 初学php之常量定义
- Android动画_AnimationSet
- nyoj301 递推求值
- LeetCode---Count Primes
- 归并排序
- js jQuery方法join()
- Up to 10% off for buy rs gold On RSorder December Special Gift
- 如何判断传过来的JSON数据中,某个字段是否存在
- Android动画效果生动有趣的通知NiftyNotification(Android Toast替代品)
- android相对布局属性
- 修改SwipeRefreshLayout源码实现自定义Header的下拉刷新控件