其他分享
首页 > 其他分享> > 2021GDCPC (B)

2021GDCPC (B)

作者:互联网

B

image

思路

看时间复杂度肯定是预处理o1查询,每个数字只能选择一次,可以使用01背包求解
f[i]+=f[i-a[j]*a[j],枚举i时,使用一个变量max,表示上一层枚举到的最大值,如果使用N的话其实好多f[i]并没有更新

代码:

int fib[N];
int f[N];
void init() {
    fib[0] = fib[1] = 1;
    f[0] = 1;
    for (int i = 2;i <= 36;i++) fib[i] = fib[i - 1] + fib[i - 2];
    int mmax=0;
    for (int i = 0;i <= 35;i++) {
        mmax=min(N-5,mmax+fib[i]);
        for (int j = mmax;j >= fib[i];j--) {
            f[j] += (f[j - fib[i]] * fib[i]) % mod;
            f[j] %= mod;
        }
    }
}
void solve() {
    int n = read();
    printf("%lld\n", f[n]);
    clean();
}

标签:int,void,fib,枚举,使用,2021GDCPC,mod
来源: https://www.cnblogs.com/koto-k/p/16165083.html