number number number (数字规律)
2017-09-11 11:05
369 查看
[align=left]题意:给出k,k代表可以使用多少个斐波拉底数列中的数字,寻找最小的不可以由k个斐波拉底数字组成的数字[/align]
[align=left]思路:发现规律,结果为 (n*2+3)-1[/align]
[align=left]注意:数字范围较大,所有直接递推求出斐波拉底数列会超时,可以使用通项公式或者矩阵快速幂求出Fi[/align]
[align=left]
[/align]
[align=left]思路:发现规律,结果为 (n*2+3)-1[/align]
[align=left]注意:数字范围较大,所有直接递推求出斐波拉底数列会超时,可以使用通项公式或者矩阵快速幂求出Fi[/align]
[align=left]
[/align]
#include <iostream> #include <cstddef> #include <cstring> #include <vector> using namespace std; typedef long long ll; const int mod=998244353; typedef vector<ll> vec; typedef vector<vec> mat; mat mul(mat &a,mat &b)//表示不会这样用,,,, { mat c(a.size(),vec(b[0].size())); for(int i=0; i<2; i++) { for(int j=0; j<2; j++) { for(int k=0; k<2; k++) { c[i][j]+=a[i][k]*b[k][j]; c[i][j]%=mod; } } } return c; } mat pow(mat a,ll n) { mat res(a.size(),vec(a.size())); for(int i=0; i<a.size(); i++) res[i][i]=1;//单位矩阵; while(n) { if(n&1) res=mul(res,a); a=mul(a,a); n/=2; } return res; } ll solve(ll n) { mat a(2,vec(2)); a[0][0]=1; a[0][1]=1; a[1][0]=1; a[1][1]=0; a=pow(a,n); return a[0][1];//也可以是a[1][0]; } int main() { ll n; while(cin>>n&&n!=-1) { cout<<solve(n*2+3)-1<<endl; } return 0;
相关文章推荐
- [noip2013]小朋友的数字(dp+规律)
- 蓝桥杯 数字游戏 (规律题&&取余)
- number number number (数字规律)
- 数字各位相加的规律
- 数字规律:Pascal‘s triangle
- number number number (数字规律)
- leetcode 423. Reconstruct Original Digits from English 乱序英文字符串恢复数字 + 发现规律
- 51nod 1770 数数字(规律)
- 经典-输出规律的数字序列
- 1072:找规律填数字
- SDJZ 找规律填数字
- 51nod 1770 数数字 找规律,注意进位,时间复杂度O(n)
- 历届试题 数字游戏 (规律)
- number number number (数字规律)
- [链接]数字键盘的排列规律
- FZU 2191 完美的数字 <数学找规律>
- 给出1组30个数字的前5个数:11235,找到规律输出这30个数及生成的30个数中的奇数.偶数的个数.
- number number number (数字规律)
- 怎样从数据库无规律字符串中截取想要的数字?
- 面试编程题:(一)数字规律