zoukankan      html  css  js  c++  java
  • Codeforces 126D Fibonacci Sums 求n由随意的Sum(fib)的方法数 dp

    版权声明:本文为博主原创文章,未经博主同意不得转载。

    https://blog.csdn.net/qq574857122/article/details/34120269

    题目链接:点击打开链接

    题意:

    给定一个数n

    问把这个数拆成多个不同样的fibonacci数

    有多少种拆法


    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    #include<math.h>
    #include<set>
    #include<queue>
    #include<vector>
    #include<map>
    using namespace std;
    #define ll __int64
    #define N 90
    ll n ,m;
    ll f[N], dp[N][2]; //dp[i][0]表示不拆分下标为i的数 dp[i][1]表示拆分下标为i的数
    vector<int>G;
    int main(){  
    	ll i, j, u, v, T; cin>>T;
    	f[1] = 1; f[2] = 2;
    	for(i=3;i<N;i++)f[i] = f[i-1] + f[i-2];
    	while(T--) {
    		G.clear();	cin>>n;
    		for(i = N-1; i; i--) {
    			if(f[i]<=n) {
    				G.push_back(i);
    				n -= f[i];
    			}
    		}
    		reverse(G.begin(), G.end());
    		dp[0][0] = 1;
    		dp[0][1] = (G[0]-1)>>1;
    		for(ll i = 1; i < G.size(); i++) {
    			dp[i][0] = dp[i-1][0] + dp[i-1][1];
    			dp[i][1] = dp[i-1][0] * ((G[i]-G[i-1]-1)/2) + dp[i-1][1] * ((G[i]-G[i-1])/2);
    		}
    		cout<<dp[G.size()-1][0]+dp[G.size()-1][1]<<endl;
    	}
    	return 0;
    }


查看全文
  • 相关阅读:
    poj 2481
    poj 3928 Ping pong
    再见oi
    NOIP 2014 解方程
    poj1836:Alignment
    poj2479:Maximum sum
    tyvj1510:专家复仇
    tyvj:P1467 通向聚会的道路
    tyvj1176: 火焰巨魔的惆怅
    tyvj1326:剑人合一
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10609582.html
  • Copyright © 2011-2022 走看看