题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6198
题目描述: 给你一个k, 你可以用K个斐波那契数列中的数来构造一个数, 现在我们要求构造不出来的那个最小的数字
解题思路: 首先我们把斐波那契数列写出来, 0, 1, 1, 2, 3, 5, 8, 13, 21, 43 . . . . . . , 我们首先发现当K == 1 的时候构造不出来的数显然是4, 然后2个的时候是12, 三个是33, 然后找规律就是 f(2*n+3)-1 ..... 说实话这题挺水的.......
代码:
//#include <iostream> //#include <cstdio> //#include <string> //#include <vector> //#include <cstring> //#include <iterator> //#include <cmath> //#include <algorithm> //#include <stack> //#include <deque> //#include <map> //#include <set> //#include <queue> //#define lson l, m, rt<<1 //#define rson m+1, r, rt<<1|1 //#define mem0(a) memset(a,0,sizeof(a)) //#define mem1(a) memset(a,-1,sizeof(a)) //#define sca(x) scanf("%d",&x) //#define de printf("======= ") //typedef long long ll; //using namespace std; // //int main() { // ll n, k; // while( scanf( "%lld%lld", &n, &k ) == 2 ) { // printf( "%lld ", k * (n-k+1) ); // } // return 0; //} #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> using namespace std; const int M = 998244353; struct Matrix { long long a[2][2]; Matrix() { memset(a, 0, sizeof(a)); } Matrix operator * (const Matrix y) { Matrix ans; for(int i = 0; i <= 1; i++) for(int j = 0; j <= 1; j++) for(int k = 0; k <= 1; k++) ans.a[i][j] += a[i][k]*y.a[k][j]; for(int i = 0; i <= 1; i++) for(int j = 0; j <= 1; j++) ans.a[i][j] %= M; return ans; } void operator = (const Matrix b) { for(int i = 0; i <= 1; i++) for(int j = 0; j <= 1; j++) a[i][j] = b.a[i][j]; } }; long long solve(long long x) { Matrix ans, trs; ans.a[0][0] = ans.a[1][1] = 1; trs.a[0][0] = trs.a[1][0] = trs.a[0][1] = 1; while(x) { if(x&1) ans = ans*trs; trs = trs*trs; x >>= 1; } return ans.a[0][0]; } int main() { int n; while( scanf( "%d", &n ) == 1 ) { printf( "%lld ", solve(2*n+2)-1 ); } return 0; }
思考: 自己一开始想的是递推的....有点儿傻逼了哈...... 但是是1e9啊 老哥, 所以就是找规律, 自己对数字的敏感程度还是不够啊, 多练练吧