hdu 3509 Buge's Fibonacci Number Problem
2015-08-16 22:13
204 查看
点击此处即可传送 hdu 3509
题目大意:F1 = f1, F2 = f2;;
F(n) = a*F(n-1) + b*F(n-2);
S(n) = F1^k + F2^k +….+Fn^k;
求S(n) mod m;
解题思路:
1:首先一个难题就是怎么判断矩阵的维数(矩阵的维数是个变量)
解决方法:开一个比较大的数组,然后再用一个公有变量记一下就行了,具体详见代码;
2:k次方,找规律;
具体上代码吧:
题目大意:F1 = f1, F2 = f2;;
F(n) = a*F(n-1) + b*F(n-2);
S(n) = F1^k + F2^k +….+Fn^k;
求S(n) mod m;
解题思路:
1:首先一个难题就是怎么判断矩阵的维数(矩阵的维数是个变量)
解决方法:开一个比较大的数组,然后再用一个公有变量记一下就行了,具体详见代码;
2:k次方,找规律;
具体上代码吧:
[code]/* 2015 - 8 - 16 晚上 Author: ITAK 今日的我要超越昨日的我,明日的我要胜过今日的我, 以创作出更好的代码为目标,不断地超越自己。 */ #include <iostream> #include <cstdio> #include <cstring> using namespace std; typedef long long LL; const int maxn = 54; LL mod, size;//size = 矩阵大小 typedef struct { LL m[maxn][maxn]; } Matrix; Matrix P; Matrix I; //正常快速幂 LL quick_mod(LL a, LL b, LL c) { LL ans = 1; if(b == 0) return 1; while(b) { if(b & 1) ans = (ans*a)%c; b >>= 1; a = (a*a)%c; } return ans; } //矩阵乘法 Matrix matrix_mul(Matrix a, Matrix b) { int i, j, k; Matrix c; for(i=0; i<size; i++) { for(j=0; j<size; j++) { c.m[i][j] = 0; for(k=0; k<size; k++) { c.m[i][j] += ((a.m[i][k]%mod)*(b.m[k][j]%mod))%mod; } c.m[i][j] %= mod; } } return c; } //矩阵的快速幂 Matrix quick_pow(LL m) { Matrix b=P, ans=I; while(m) { if(m & 1) ans = matrix_mul(ans, b); m >>= 1; b = matrix_mul(b, b); } return ans; } //组合数。。。 LL c[50][50]; int main() { memset(c, 0, sizeof(c)); for(int i=0; i<50; i++) { c[i][0] = 1; c[i][i] = 1; } for(int i=1; i<50; i++) for(int j=1; j<i; j++) c[i][j] = c[i-1][j] + c[i-1][j-1]; int t; Matrix tmp; LL f1, f2, a, b, k, n, m ; LL sum, ans1, ans2; //scanf("%d",&t); cin>>t; while(t--) { sum = 0; cin>>f1>>f2>>a>>b>>k>>n>>mod; //scanf("%lld%lld%lld%lld%lld%lld%lld",&f1,&f2,&a,&b,&k,&n,&mod); memset(P.m, 0, sizeof(P.m)); memset(I.m, 0, sizeof(I.m)); if(k == 0) printf("%lld\n",n%mod); else { if(n == 1) cout<<quick_mod(f1, k, mod)<<endl; else if(n == 2) cout<<(quick_mod(f1,k,mod) + quick_mod(f2,k,mod))%mod<<endl; else { size = k+2; //矩阵赋值 for(int i=0; i<size; i++) I.m[i][i] = 1; P.m[0][0] = 1; P.m[0][size-1] = 1; for(int i=1; i<size-1; i++) P.m[0][i] = 0; for(int i=1; i<size; i++) for(int j=size-i,w=0; j<size; j++,w++) { P.m[i][j]=(((c[i-1][w]%mod)*quick_mod(a,w,mod))%mod)*quick_mod(b,i-1-w,mod); P.m[i][j] %= mod; } tmp = quick_pow(n-1); sum = (sum+(tmp.m[0][0]%mod)*(quick_mod(f1,k,mod)))%mod; for(int i=1; i<size; i++) { ans1 = (quick_mod(f1,size-1-i,mod)*quick_mod(f2,i-1,mod))%mod; ans2 = (ans1*(tmp.m[0][i]%mod))%mod; sum = (sum+ans2)%mod; } cout<<sum%mod<<endl; } } } return 0; }
相关文章推荐
- 玩一下比特币-超土版
- 【图像处理】对opencv的配置
- 权限修饰符
- Java 生成 UUID
- 黑马程序员——Java基本数据类型及其相互转换
- HDU 4291 A Short problem(矩阵快速幂+循环节)
- Android之Handler用法总结
- jquery获取、改变元素属性值2
- [转] 确定性投资的框架
- ASP.NET OAuth:解决refresh token无法刷新access token的问题
- SVN认识小结
- POJ 1004 Financial Management
- HDU 2795 Billboard // 线段树 单点更新
- Qt:使用gSoap做一个简单的CS系统
- [转] 投资策略及投资体系
- (GNU C)__attribute__机制
- 糊涂账
- pytesser图片文本识别
- C#基础--之数据类型
- python2+opencv2做图像处理