第一次写压位高精度只好抄黄学长的
代码最后一段想了好久一看评论区才知道黄学长写错了= =很气
自己最后改对了T^T
这题最优是一直划分3出来直到<=4

#include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<algorithm> #define ll long long using namespace std; const int maxn=500010,inf=1e9; int n,l=1,d[3000],ans[3000]={1}; void mul(int x) { for(int i=0;i<l;i++)ans[i]*=x; for(int i=0;i<l;i++) { ans[i+1]+=ans[i]/10000; ans[i]%=10000; } for(;ans[l];l++)ans[l+1]+=ans[l]/10000,ans[l]%=10000; } int get(int x) { if(x>=1000)return 4; if(x>=100)return 3; if(x>=10)return 2; return 1; } int main() { scanf("%d",&n); for(;n>4;n-=3)mul(3);mul(n); for(int i=0;i<l;i++)d[i]=get(ans[i]); printf("%d ",(l-1)*4+d[l-1]); printf("%d",ans[l-1]); for(int i=l-2;i>=max(0,l-25);i--) { for(int j=d[i]+1;j<=4;j++)putchar('0'); printf("%d",ans[i]); } if(l-25>0) { if(d[l-1]==3)printf("%d",ans[l-26]/1000); else if(d[l-1]==2) { if(ans[l-26]<1000)putchar('0'); printf("%d",ans[l-26]/100); } else if(d[l-1]==1) { if(ans[l-26]<1000)putchar('0'); if(ans[l-26]<100)putchar('0'); printf("%d",ans[l-26]/10); } } return 0; }