project euler 21~25

21

#include<bits/stdc++.h>
using namespace std;

const int maxn=10010;
vector<int> ans[maxn];
int  d[maxn];

int main()
{
    for(int i=1;i<maxn;++i){
        ans[i].push_back(1);
        for(int j=2;j<=int(sqrt(i)+0.5);++j){
            if(i%j==0) {
                ans[i].push_back(j);
                if(j!=i/j)ans[i].push_back(i/j);
            }
        }
    }
    for(int i=1;i<maxn;++i){
        //cout<<i<<" : ";
        sort(ans[i].begin(),ans[i].end());
        int sum=0;
        for(int j=0;j<ans[i].size();++j){
            //cout<<ans[i][j]<<' ';
            sum+=ans[i][j];
        }
        d[i]=sum;
        //cout<<endl;
    }
    int sum=0;
    for(int i=1;i<10000;++i){
        int tp=d[i];
        if(tp>=10000||tp<0) continue;
        if(d[tp]==i&&tp!=i){
            sum+=tp;
            sum+=i;
            cout<<i<<' '<<tp<<endl;
            d[i]=-1;
        }
    }
    cout<<sum<<endl;
    return 0;
}

22

#include<bits/stdc++.h>
using namespace std;

string s;

vector<string> ans;

int main()
{
    freopen("in.txt","r",stdin);
    getline(cin,s);
    string tp="";
    int flag=0;
    for(int i=0;i<s.size();++i)
    {
        if(s[i]=='"'){
            if(flag==0){
                tp.clear();
                flag=1;
            }
            else if(flag==1){
                ans.push_back(tp);
                flag=0;
            }
        }
        else if(s[i]!=','){
            tp+=s[i];
        }
    }
//    cout<<ans.size()<<endl;
//    for(int i=0;i<10;++i){
//        cout<<ans[i]<<endl;
//    }
    sort(ans.begin(),ans.end());
    long long sum=0;
    for(int i=0;i<ans.size();++i){
        long long tmp=0;
        for(int j=0;j<ans[i].size();++j){
            tmp+=ans[i][j]-'A'+1;
        }
        sum+=tmp*(i+1);
    }
    cout<<sum<<endl;
    return 0;
}

23

#include<bits/stdc++.h>
using namespace std;

const int maxn=30010;
vector<int> ans[maxn];
vector<int> bns;
bool vis[maxn];

int main()
{
    for(int i=1;i<maxn;++i){
        ans[i].push_back(1);
        for(int j=2;j<=int(sqrt(i)+0.5);++j){
            if(i%j==0) {
                ans[i].push_back(j);
                if(j!=i/j)ans[i].push_back(i/j);
            }
        }
    }
    for(int i=1;i<maxn;++i){
        //cout<<i<<" : ";
        int sum=0;
        for(int j=0;j<ans[i].size();++j){
            //cout<<ans[i][j]<<' ';
            sum+=ans[i][j];
        }
        if(sum>i) bns.push_back(i);
        //cout<<endl;
    }
    cout<<bns.size()<<endl;
//    for(int i=0;i<bns.size();++i){
//        cout<<bns[i]<<endl;
//    }
    for(int i=0;i<bns.size();++i){
        for(int j=i;j<bns.size();++j){
            if(bns[i]+bns[j]<maxn) vis[bns[i]+bns[j]]=true;
        }
    }
    int sum=0;
    int num=0;
    for(int i=1;i<maxn;++i){
        if(!vis[i]) sum+=i,++num;
    }
    cout<<num<<" "<<sum<<endl;
    return 0;
}

24

#include<bits/stdc++.h>
using namespace std;

const int maxn=100;

typedef long long ll;

ll factorial[maxn];

int n;
ll x;

//O(n^2) x散列值(从0开始) a[] 散列值对应的排列
void int_To_Array(ll x,int a[maxn])
{
    bool used[maxn];
    int i,j;
    ll temp;
    for(i=1;i<=n;++i) used[i]=false;
    for(i=1;i<=n;++i){
        temp=x/factorial[n-i];
        for(j=1;j<=n;++j) if(!used[j]){
            if(temp==0) break;
            --temp;
        }
        a[i]=j;
        used[j]=true;
        x%=factorial[n-i];
    }
}

//O(n^2) a[] 给定的排列   x散列值(从0开始)
ll array_to_int(int a[maxn])
{
    int i,j;
    ll ans=0,temp;
    for(i=1;i<=n;++i){
        temp=a[i]-1;
        for(j=1;j<i;++j) if(a[j]<a[i]) --temp;
        ans+=factorial[n-i]*temp;
    }
    return ans;
}

void init()
{
    factorial[0]=factorial[1]=1;
    for(int i=2;i<=19;++i){
        factorial[i]=factorial[i-1]*i;
    }
}

int ans[maxn];

int main()
{
    init();
    cin>>n>>x;
    //序号x从0开始
    int_To_Array(x,ans);
    for(int i=1;i<=n;++i) cout<<ans[i]<<' ';

//    cout<<endl;
//
//    cout<<array_to_int(ans)<<endl;


    return 0;
}

25

#include<bits/stdc++.h>
using namespace std;

const int maxn=10000;

const int ten[4]={1,10,100,1000};

struct BigNumber{
    int d[maxn];
    BigNumber (string s)
    {
        int len=s.size();
        d[0]=(len-1)/4+1;
        int i,j,k;
        for(int i=1;i<maxn;++i) d[i]=0;
        for(int i=len-1;i>=0;--i){
            j=(len-i-1)/4+1;
            k=(len-i-1)%4;
            d[j]+=ten[k]*(s[i]-'0');
        }
            while(d[0]>1 && d[d[0]]==0) --d[0];
    }
    BigNumber(){
        *this=BigNumber(string("0"));
    }

    string to_string(){
        string s("");
        int i,j,temp;
        for(i=3;i>=1;--i) if(d[d[0]]>=ten[i]) break;
        temp=d[d[0]];
        for(j=i;j>=0;--j){
            s=s+(char)(temp/ten[j]+'0');
            temp%=ten[j];
        }
        for(i=d[0]-1;i>0;--i){
            temp=d[i];
            for(j=3;j>=0;--j){
                s=s+(char)(temp/ten[j]+'0');
                temp%=ten[j];
            }
        }
        return s;
    }
};

BigNumber operator + (const BigNumber &a,const BigNumber &b){
    BigNumber c;
    c.d[0]=max(a.d[0],b.d[0]);
    int i,x=0;
    for(i=1;i<=c.d[0];++i){
        x=a.d[i]+b.d[i]+x;
        c.d[i]=x%10000;
        x/=10000;
    }
    while(x!=0){
        c.d[++c.d[0]]=x%10000;
        x/=10000;
    }
    return c;
}

int main()
{
    BigNumber f[2];
    f[0]=BigNumber("1");
    f[1]=BigNumber("1");
    //cout<<f[0].to_string()<<' '<<f[1].to_string()<<endl;
    int index=2;
    BigNumber ff;
     //ff=f[0]+f[1];
     //cout<<ff.to_string()<<endl;
    while(ff.to_string().size()<1000)
    {
        ff=f[0]+f[1];
        //cout<<ff.to_string()<<endl;
        index++;
        f[0]=f[1];
        f[1]=ff;
    }
    cout<<index<<endl;
    return 0;
}

note that fn=ϕnψn5 f n = ϕ n − ψ n 5 where ϕ=1+52 ϕ = 1 + 5 2 and ψ=152 ψ = 1 − 5 2

and |ψ|<1 | ψ | < 1 so when n,ψ0 n → ∞ , ψ → 0

so we have ϕn510999 ϕ n 5 ≥ 10 999

using natural logarithms

nln(5×10999)ln(ϕ)nln(5)+(999×ln(10))ln(ϕ)n4781.85927 n ≥ ln ⁡ ( 5 × 10 999 ) ln ⁡ ( ϕ ) ⟹ n ≥ ln ⁡ ( 5 ) + ( 999 × ln ⁡ ( 10 ) ) ln ⁡ ( ϕ ) ⟹ n ≥ 4781.85927

code

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int num_dig;
    long double psi=(sqrt(5)+1)/2;
    num_dig=1000;
    long double ans=(log(sqrt(5))+log(10)*(num_dig-1))/log(psi);
    cout<<setprecision(12)<<ans<<endl;
    cout<<ceil(ans)<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值