满分后看提交记录找到以下压位高精度代码:
#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是怎么回事?