HDU6050 Funny Function[矩阵快速幂]
来源:互联网 发布:手机网络不卡玩游戏卡 编辑:程序博客网 时间:2024/06/07 17:35
Funny Function
HDU - 6050题意:
给出一个函数由题目给的公式可以求出其他项,给出一个n和m,根据这个求出。结果取模1e9+7
题解:
根据前几项
1 1 3 5 11 21 43 85 171 341 683 ......
都是由第二条公式推导出来的
那么当n等于3的时候,第二行 就变成 5 9 19 37 75 149 ......
当n等于4的时候,第二行就变成 10 20 40 80 160 320 640 ......
手动自己写一下几项 会发现同样还是符合第二条
那么就会有一条
T_T 观察一下吧
然后就会发现一个规律
最后根据这三个式子
我们可以得出
当n为偶数的时候
当n为奇数的时候
然后我们就得到我们要的矩阵了
用矩阵快速幂就可以直接求出答案了
#pragma comment(linker, "/STACK:102400000,102400000")#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<string>#include<algorithm>#include<queue>#include<stack>#include<set>#include<map>#include<vector>using namespace std;typedef long long ll;const int mod=1e9+7;const int N=2;ll a[N][N],b[N][N],ans[N][N],tmp[N][N];ll Mul(ll a[][N],ll b[][N]){ memset(tmp,0,sizeof(tmp)); for (int i=0 ; i<N ; ++i) for (int j=0 ; j<N ; ++j) if (a[i][j]) for (int k=0 ; k<N ; ++k) tmp[i][k]=(tmp[i][k]+a[i][j]*b[j][k]%mod+mod)%mod; for (int i=0 ; i<N ; ++i) for (int j=0 ; j<N ; ++j) a[i][j]=tmp[i][j];}ll Pow(ll ans[][N],ll a[][N],ll m){ while (m) { if (m&1) Mul(ans,a); Mul(a,a); m>>=1; }}ll Add(ll a[][N],ll b[][N],int flag){ for (int i=0 ; i<N ; ++i) for (int j=0 ; j<N ; ++j) a[i][j]=(a[i][j]+flag*b[i][j]+mod)%mod;}void initial(ll n,int flag){ memset(b,0,sizeof(b)); memset(ans,0,sizeof(ans)); memset(a,0,sizeof(a)); for (int i=0 ; i<N ; ++i) b[i][i]=ans[i][i]=1; a[0][1]=a[1][1]=1; a[1][0]=2; Pow(ans,a,n); for (int i=0 ; i<N ; ++i) for (int j=0 ; j<N ; ++j) a[i][j]=ans[i][j]; memset(ans,0,sizeof(ans)); for (int i=0 ; i<N ; ++i) ans[i][i]=1; if (flag==1) { b[0][0]=1; b[0][1]=-1; b[1][0]=-2; b[1][1]=0; } Add(a,b,flag);}int main(){ int T; scanf("%d",&T); while (T--) { ll n,m; scanf("%lld%lld",&n,&m); int flag=n&1?1:-1; initial(n,flag); Pow(ans,a,m-1); ll res=0; for (int i=0 ; i<N ; ++i) res=(res+ans[0][i])%mod; printf("%lld\n",res); } return 0;}
阅读全文
0 0
- HDU6050 Funny Function[矩阵快速幂]
- hdu6050 Funny Function【打表+找规律+矩阵快速幂】
- Funny Function————(hdu6050)矩阵快速幂
- HDU6050-Funny Function
- HDU6050-Funny Function
- 2017杭电多校联赛第二场-Funny Function (hdu6050)快速幂解数学方程
- 2017多校训练第二场 hdu6050 Funny Function(数学+快速幂+逆元)
- HDU 6050 Funny Function 矩阵快速幂
- hdu 6050Funny Function矩阵快速幂
- HDU6050(矩阵快速幂)
- hdu6050 推公式矩阵快速幂
- (矩阵快速幂, 数学公式推导)HDU 6050 Funny Function
- hdu 6050 Funny Function (矩阵快速幂)
- HDU 6050 Funny Function(矩阵快速幂或公式)
- Hdu6050 Funny Function(2017多校第2场)
- 2017多校训练Contest2: 1006 Funny Function hdu6050
- HDU 6050 Funny Function(快速幂)
- hdu 6050 Funny Function(快速幂)
- 小白对C#泛型的理解
- 事务的原理 学习笔记
- 20个常用的java代码片段
- 程序员广告
- getLocationInWindow和getLocationOnScreen
- HDU6050 Funny Function[矩阵快速幂]
- 在线工具|fztool.com
- 解决android studio requestWindowFeature(Window.FEATURE_NO_TITLE); 隐藏失败
- popupwindow曾今遇到的坑
- 笔记——“Human-level control through deep reinforcement learning”
- sklearn通过OneVsRestClassifier实现svm.SVC的多分类
- spring boot 笔记(一):pom,注解
- storm两个案例(1单词计数本地执行 2累加集群执行 3集群关闭storm任务写法)
- AIDL最佳实践