P1045 [NOIP2003 普及组] 麦森数 2021-05-14 24 笔记 老师给的题解 ```cpp #include #include #include using namespace std; int s[1000],ts[1000],lents,lens=1,a[1000],lena=1,ta[1000],lenta; int p; void ksm(int p) { s[1]=1,a[1]=2; while(p!=0) { if(p%2==1) { memset(ts,0,sizeof(ts)); for(int i=1;i<=501;i++) { for(int j=1;j<=501;j++) { ts[i+j-1]+=s[i]*a[j]; } } for(int i=1;i<=501;i++) { if(ts[i]>=10) { ts[i+1]+=ts[i]/10; ts[i]%=10; } } for(int i=1;i<=501;i++) { s[i]=ts[i]; } //s1=s1*a1; } p/=2; memset(ta,0,sizeof(ta)); for(int i=1;i<=501;i++) { for(int j=1;j<=501;j++) { ta[i+j-1]+=a[i]*a[j]; } } for(int i=1;i<=501;i++) { if(ta[i]>=10) { ta[i+1]+=ta[i]/10; ta[i]%=10; } } for(int i=1;i<=501;i++) { a[i]=ta[i]; } //a1=a1*a1; } } int main() { cin>>p; cout<<(int)(p*log10(2)+1)<=1;i--) { k++; cout< #include #include using namespace std; int p; int a[505],s[505],c[505],d[505],len=1; void work1()//处理进位 { for(int i=1;i<=500;i++) { d[i+1]+=d[i]/10;d[i]%=10; } } void work2()//处理进位 { for(int i=1;i<=500;i++) { c[i+1]+=c[i]/10;c[i]%=10; } } void ksm(int b)//快速幂 { s[1]=1,a[1]=2; while(b>0) { if(b%2==1) { memset(d,0,sizeof(d));//清零 for(int i=1;i<=500;i++) { for(int j=1;j<=500;j++) { d[i+j-1]+=s[i]*a[j];// } } work1(); for(int i=1;i<=500;i++) s[i]=d[i];// } b=b/2; memset(c,0,sizeof(c)); for(int i=1;i<=500;i++) { for(int j=1;j<=500;j++) { c[i+j-1]+=a[i]*a[j]; } } work2(); for(int i=1;i<=500;i++) a[i]=c[i]; } } int main() { cin>>p; int k=(int)(p*(log10(2)))+1; cout<0) s[1]=s[1]-1; else { for(int i=1;i<=500;i++) { s[i+1]--;s[i]=s[i]-1+10; } } for(int i=500;i>=1;i--) cout< 本文链接: https://shrinken.pw/crash-2021-05-14_37-fml.html