HDU 6198 2017沈阳网络赛 线形递推

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6198

题意:给出一个数k,问用k个斐波那契数相加,得不到的数最小是几。

解法:先暴力打表看看有没有规律。

#include <bits/stdc++.h>
using namespace std;
int dp[2000][2000];
typedef long long LL;
int main()
{
    LL c[50];
    c[0]=0;
    c[1]=1;
    c[2]=1;
    for(int i=2; i<50; i++) c[i] = c[i-1]+c[i-2];
    dp[0][0]=1;
    for(int i=0; i<=40; i++){
        for(int j=1; j<=40; j++){
            for(int k=c[i]; k<=1000; k++){
                dp[j][k] = dp[j][k] + dp[j-1][k-c[i]];
            }
        }
    }
    for(int i=1; i<=40; i++)
        for(int j=1; j<=1000; j++)
    if(dp[i][j]==0){
        printf("%d\n", j);
        break;
    }
}

然后发现这恰好是一个线形递推,递推式就是dp[n]=dp[n-1]*3-dp[n-2]+1。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mod = 998244353;
struct Matrix{
    LL a[3][3];
    void set1(){
        memset(a, 0, sizeof(a));
    }
    void set2(){
        set1();
        for(int i=0; i<3; i++) a[i][i]=1;
    }
    void set3(){
        a[0][0]=3,a[0][1]=-1,a[0][2]=1;
        a[1][0]=1,a[1][1]=0,a[1][2]=0;
        a[2][0]=0,a[2][1]=0,a[2][2]=1;
    }
    void set4(){
        set1();
        a[0][0]=12;
        a[1][0]=4;
        a[2][0]=1;
    }
};
Matrix operator*(const Matrix &a, const Matrix &b){
    Matrix res;
    res.set1();
    for(int i=0; i<3; i++){
        for(int j=0; j<3; j++){
            for(int k=0; k<3; k++){
                res.a[i][j] = (res.a[i][j]+a.a[i][k]*b.a[k][j]+mod)%mod;
            }
        }
    }
    return res;
}
Matrix qsm(Matrix a, int n){
    Matrix res;
    res.set2();
    while(n){
        if(n&1) res=res*a;
        a=a*a;
        n/=2;
    }
    return res;
}
int main()
{
    int n;
    while(scanf("%d", &n)!=EOF)
    {
        if(n==1) printf("4\n");
        else if(n==2) puts("12");
        else{
            Matrix a,b;
            a.set3();
            b.set4();
            a = qsm(a,n-2);
            a=a*b;
            printf("%lld\n", (a.a[0][0]+mod)%mod);
        }
    }
    return 0;
}
时间: 2024-10-12 08:37:06

HDU 6198 2017沈阳网络赛 线形递推的相关文章

HDU 6205 2017沈阳网络赛 思维题

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6205 题意:给你n堆牌,原本每一堆的所有牌(a[i]张)默认向下,每次从第一堆开始,将固定个数的牌(b[i]张)翻上,然后下一堆继续,直到没有足够的牌翻上,然后你可以获得当前已经操作过的堆的所有牌.最初你可以调整堆的顺序,把第一堆放到最后一堆(逆时针旋转),你可以重复这个操作,问你要重复多少次这个操作,才能获得最多的牌. 解法:先把这个序列复制一遍放在原来的序列后面.当i=n的时候结束就可以了,每次

HDU 6200 2017沈阳网络赛 树上区间更新,求和

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6200 题意:给个图,有2种操作,一种是加一条无向边,二是查询u,v之间必须有的边的条数,所谓必须有的边就是对于u,v必须通过这条边才能到达. 解法:一个很简单的想法,搞出图上的一颗树,然后剩下的边当成询问点队加到更新点集,每加入一个更新点对,直接把u,v区间的值置为0即可,查询就直接区间求和,可以直接树剖来维护,简单暴力,读入挂卡过.还有1个log的做法,可以用LCT维护(这个没写,口胡的) #in

HDU 6201 2017沈阳网络赛 树形DP或者SPFA最长路

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6201 题意:给出一棵树,每个点有一个权值,代表商品的售价,树上每一条边上也有一个权值,代表从这条边经过所需要的花费.现在需要你在树上选择两个点,一个作为买入商品的点,一个作为卖出商品的点,当然需要考虑从买入点到卖出点经过边的花费.使得收益最大.允许买入点和卖出点重合,即收益最小值为0. 解法:我们设1为根节点,假设一开始一个人身上的钱为0.我们设dp[i][0]表示从根节点走到i及其子树并中任一点买

The Nth Item 南昌网络赛(递推数列,分段打表)

The Nth Item \[ Time Limit: 1000 ms \quad Memory Limit: 262144 kB \] 题意 给出递推式,求解每次 \(F[n]\) 的值,输出所有 \(F[n]\) 的 \(xor\) 值. 思路 对于线性递推数列,可以用特征方程求出他的通项公式,比如这题 \[ F[n] = 3F[n-1]+2F[n-2] \x^2 = 3x+2 \x = \frac{3\pm \sqrt{17}}{2} \] 令 \(F[n] = C_1x_1^n + C_

HDU 6197 array array array 2017沈阳网络赛 LIS

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6197 题意:给你n个数,问让你从中删掉k个数后(k<=n),是否能使剩下的序列为非递减或者非递增序列 解法:签到题,就是让你求最长不下降子序列长度len,然后判断下n-len是否小于k(将序列反着存下来然后再求即最长不上升子序列,取两者len中的较大值),然后直接套nlogn的模板即可. #include <bits/stdc++.h> using namespace std; const

2015沈阳网络赛1003 Minimum Cut 树链剖分 数组维护前缀和进行区间增减

2015沈阳网络赛1003  Minimum Cut   树链剖分 数组维护前缀和进行区间增减 Minimum Cut Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 65535/102400 K (Java/Others)Total Submission(s): 0    Accepted Submission(s): 0 Problem Description Given a simple unweighted graph G 

HDU 5024 (广州网络赛) Wang Xifeng&#39;s Little Plot 记忆化搜索+枚举

Problem Description <Dream of the Red Chamber>(also <The Story of the Stone>) is one of the Four Great Classical Novels of Chinese literature, and it is commonly regarded as the best one. This novel was created in Qing Dynasty, by Cao Xueqin.

2019ACM-ICPC沈阳网络赛-C-Dawn-K&#39;s water(完全背包模板题)

Dawn-K's water  1000ms 262144K Dawn-K recently discovered a very magical phenomenon in the supermarket of Northeastern University: The large package is not necessarily more expensive than the small package. On this day, Dawn-K came to the supermarket

2019ACM-ICPC沈阳网络赛-K-Guanguan&#39;s Happy water(思维+暴力)

Guanguan's Happy water 4000ms 262144K Rather than drinking happy water, Guanguan loves storing happy water. So he bought a refrigerator and stored a_iai? bottles of cola into it every day. When the storage is finished on the kk-th day, the refrigerat