@[lijinhan_bmx](/user/964822)
压位优化,一次计算60次幂然后统一进位
```cpp
#include<bits/stdc++.h>
using namespace std;
unsigned long long m[510];
int main()
{
long long p;
cin>>p;
cout<<(long long)(log10(2)*p+1)<<endl;
m[1]=2;
p--;
for(;p>0;p-=60)
{
for(int j=1;j<=500;j++) (p>60?(m[j]<<=60):(m[j]<<=p));
for(int j=1;j<=500;j++)if(m[j]>=10)m[j+1]+=m[j]/10,m[j]%=10;
}
m[1]--;//2的p次幂一定不是5的倍数,所以也不会是10的倍数,末尾没有0,不考虑退位的问题;
for(int i=9;i>=0;i--)
{
for(int j=50;j>0;j--) cout<<m[i*50+j];
cout<<'\n';
}
return 0;
}
```
[AC](https://www.luogu.com.cn/record/117299700)
by Life_passing_by @ 2023-07-25 09:21:06
@[lijinhan_bmx](/user/964822) 前面的计算位数是一个高中数学知识的推导,不懂的话可以学一下对数然后看第一篇题解
by Life_passing_by @ 2023-07-25 09:22:26
@[Life_passing_by](/user/222411) 谢谢
by protractor @ 2023-07-25 12:49:19