奥特战士 @ 2020-10-28 16:14:59
代码如下
#include<bits/stdc++.h>
using namespace std;
const int N=2e6;
int p;
int tmp[N],ans[N]={0,1},num[N]={0,2},lena=1,lenb=1;
inline int read(){
int s=1,w=0;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')s=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){w=(w<<3)+(w<<1)+ch-'0';ch=getchar();}
return s*w;
}
inline void write(int x){
if(x<0){
putchar('-');
x=-x;
}
if(x>9)write(x/10);
putchar(x%10+'0');
return;
}
void gjca(){
int len=lena+lenb-1;
for(int i=1;i<=lena;i++){
for(int j=1;j<=lenb;j++){
tmp[i+j-1]+=ans[i]*num[j];
}
}
for(int i=1;i<=len;i++){
tmp[i+1]+=tmp[i]/10;
tmp[i]%=10;
}
while(tmp[len+1]>0){
len++;
tmp[len+1]+=tmp[len]/10;
tmp[len]%=10;
}
for(int i=1;i<=len;i++){
ans[i]=tmp[i];
tmp[i]=0;
}
lena=len;
return;
}
void gjcb(){
int len=2*lenb-1;
for(int i=1;i<=lenb;i++){
for(int j=1;j<=lenb;j++){
tmp[i+j-1]+=num[i]*num[j];
}
}
for(int i=1;i<=len;i++){
tmp[i+1]+=tmp[i]/10;
tmp[i]%=10;
}
while(tmp[len+1]>0){
len++;
tmp[len+1]+=tmp[len]/10;
tmp[len]%=10;
}
for(int i=1;i<=len;i++){
num[i]=tmp[i];
tmp[i]=0;
}
lenb=len;
return;
}
void ksm(int p){
while(p){
if(p&1)gjca();
p>>=1;
gjcb();
}
return;
}
int main(){
p=read();
ksm(p);
ans[1]--;
write(lena);
for(int i=500;i>=1;i--){
if(i%50==0)puts("");
putchar(ans[i]+'0');
}
return 0;
}
by Schwarzkopf_Henkal @ 2020-10-28 16:20:13
不要用大括号初始化数组
by 奥特战士 @ 2020-10-28 16:26:28
@Schwarzkopf_Henkal 谢谢大佬,已经过了