60分快速幂求条(玄关)

P1045 [NOIP2003 普及组] 麦森数

wuenzi @ 2024-08-08 11:58:22

#include<iostream>
#include<cstring>
using namespace std;
string cf(string n,string m){
    int c[100005]={};
    string ans="";
    if(n=="0"||m=="0"){
        return "0";
    }
    if(n[0]=='-'&&m[0]!='-'){
        ans+="-";
        n.erase(0,1);
    }else if(n[0]!='-'&&m[0]=='-'){
        ans+="-";
        m.erase(0,1);
    }else if(n[0]=='-'&&m[0]=='-'){
        m.erase(0,1);
        n.erase(0,1);
    }
    if(n.size()<m.size()){
        swap(n,m);
    }
    for(int i=1;i<=m.size();i++){
        for(int j=1;j<=n.size();j++){
            int q=(m[i-1]-'0')*(n[j-1]-'0');
            c[i+j-1]+=q;
        }
    }
//  cout<<c[0]<<endl;

    int l=m.size()+n.size();
//  for(int i=1;i<l;i++){
//      cout<<c[i]<<" ";
//  }
//  cout<<endl;
    for(int i=l-1;i>0;i--){
        c[i-1]+=c[i]/10;
        c[i]%=10;
    }
//  for(int i=0;i<l;i++){
//      cout<<c[i]<<' ';
//  }
//  cout<<endl;
    if(c[0]>0){
        int i=0;
        while(i<=l&&c[i]==0){
            i++;
        }
        if(i>l){
            return "0";
        }
        for(;i<l;i++){
            ans+=char(c[i]+'0');
        }
    }else{
        int i=1;
        while(i<=l&&c[i]==0){
            i++;
        }
        if(i>l){
            return "0";
        }
        for(int i=1;i<l;i++){
            ans+=char(c[i]+'0');
        }
    }
    return ans;
}

int cnt,q;
string k="1",a="2";
int main(){
    int n;
    cin>>n;
    while(n){
        if(n%2){
            k=cf(k,a);
        }
        a=cf(a,a);
        n>>=1;
    }
    k[k.size()-1]-=1;
    cout<<k.size();
    if(k.size()<500){
        for(int i=0;i<500-k.size();i++){
            if(i%50==0){
                cout<<endl;
            }
            cout<<0;
            cnt++;
        }
        for(int i=0;i<k.size();i++){
//      cout<<1;
        if((i+cnt)%50==0){
            cout<<endl;
        }
        cout<<k[i];
    }
    }else{
        for(int i=k.size()-500;i<k.size();i++){
//      cout<<1;
        if(q%50==0){
            cout<<endl;
        }
        cout<<k[i];
        q++;
}
}
    return 0;
}

by sjy01 @ 2024-08-09 10:05:57

@wuenzi,这是我的AC代码:

#include<bits/stdc++.h>
using namespace std;
int p,sum[501],r[1001];
void pd(int p){
    if(p==0) return;
        pd(p/2);
    for(int i=1;i<=500;i++){
        for(int j=1;j<=500;j++){
        if(p%2==0){
            r[i+j-1]+=sum[i]*sum[j];
            }else{
        r[i+j-1]+=sum[i]*sum[j]*2;  
        }
    }
    }
    for(int i=1;i<=500;i++){
    sum[i]=r[i]%10;
    r[i+1]+=r[i]/10;
    }
    for(int i=1;i<=1000;i++){
    r[i]=0;
    }   
}
int main(){
    cin>>p;
    cout<<(int)(p*log10(2)+1)<<endl;    
    sum[1]=1;
    pd(p);
    for(int i=500;i>=2;i--){
    cout<<sum[i];
    if(i%50==1){
        cout<<endl;
    }
    }
    cout<<sum[1]-1<<endl;
    return 0;
} 

by sjy01 @ 2024-08-09 10:06:49

代码有点歪,将就看一下。


by wuenzi @ 2024-08-12 10:17:17

感谢,已关


by wuenzi @ 2024-08-12 10:18:15

好像早就互关了


by Ambrose0321 @ 2024-10-25 12:00:43

@wuenzi 你在哪个机构学的?


|