满分有疑惑悬关
查看原帖
满分有疑惑悬关
246331
mystic_qwq楼主2023/5/2 17:12

满分后看提交记录找到以下压位高精度代码:

#include<stdio.h>
typedef long long ll;

const ll P=1e18;
int n,l1,l2; ll f1[85],f2[85];

int main() {
    scanf("%d",&n);
    f1[0]=1,f2[0]=2;
    for (int i=2; i<=n; ++i) {
        for (int j=0; j<=l2+1; ++j) {
            const ll t=f1[j]+f2[j];
            f1[j]=f2[j],f2[j]=(t>=P?++f1[j+1],t-P:t);
        }
        l1=l2,l2+=f2[l2+1];
    }
    printf("%lld",f1[l1]);
    for (int i=l1-1; ~i; --i)
        printf("%018lld",f1[i]);
    return 0;
}

这个代码我有以下不明白的地方:

f2[j]=(t>=P?++f1[j+1],t-P:t);

这个代码为什么要增加f1[j+1], 不是f2是更过之后的数字吗?

l2+=f2[l2+1];

为什么要这样增加?

printf("%lld",f1[l1]);
for (int i=l1-1; ~i; --i)
    printf("%018lld",f1[i]);

这个输出为什么要输出l1而不是l2?然后它这个~i是怎么回事,改成i可不可以,然后就是这个printf格式的问题,这个%018是怎么回事?

2023/5/2 17:12
加载中...