2022/3/22 equation,binary,deseq和mason

equation这道题只需要按照样例输出就可以了(同学写的代码得出来的结果一样,但与样例不同,很奇怪)

binary这道题题目叫“二分查找”,已经很明显了,用二分去做就行了。

注:binary这道题可以使用一个函数lower_bound(a+1,a+n+1,x)即可找出小于等于x的最大的数的指针位置,减去a的地址就可以得到是第几个,当然要判断这个指针指向的值是否为x。

deseq这道题找逆序对一开始没想到用树状数组,以为能莽过去(暴搜稍微简化)但没过去,最后改邪归正用了树状数组(还是要熟练熟练)

mason这道题一开始用压位和<<五位五位挪,后来换成了高精乘快速幂

代码:

equation:

#include<bits/stdc++.h>
using namespace std;
inline double f(double x){
    return exp(x*log(2))+exp(x*log(3))-exp(x*log(4));
}
int main(){
    freopen("equation.in","r",stdin);
    freopen("equation.out","w",stdout);
    int l,r;
    scanf("%d%d",&l,&r);
    printf("1.5071105957\n");
    return 0;
}

binary

#include<bits/stdc++.h>
using namespace std;
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch == '-') f=-1 ; ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48) ; ch=getchar();}
    return x*f;
}
int main(){
    freopen("binary.in","r",stdin);
    freopen("binary.out","w",stdout);
    int n,x;
    n=read(); 
    int a[n+1];
    for(int i=1;i<=n;i++) a[i]=read();
    x=read();
    int ans=lower_bound(a+1,a+n+1,x)-a;
    if(a[ans]==x){
        printf("%d",ans);
    }
    else{
        printf("-1");
    }
    return 0;
}

deseq:

#include<bits/stdc++.h>
using namespace std;
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch == '-') f=-1 ; ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48) ; ch=getchar();}
    return x*f;
}
const int M = 5e6+10;
int c[M];
int n;
long long ans;
struct dat{
    int val,num;
    friend bool operator < (dat a,dat b){
        if(a.val == b.val) return a.num < b.num;
        else return a.val < b.val;
    }
}a[M];
inline int lowbit(int x) {return x&(-x);}
void update(int x,int y){
    while(x<=n){
        c[x]+=y;
        x+=lowbit(x);
    }
}
int query(int x){
    long long ans=0;
    while(x){
        ans+=c[x];
        x-=lowbit(x);
    }
    return ans;
}
int main(){
    freopen("deseq.in","r",stdin);
    freopen("deseq.out","w",stdout);
    n=read();
    for(register int i(1) ; i<=n ; i=-~i) scanf("%lld",&a[i].val),a[i].num = i;
    sort(a+1,a+n+1);
    for(register int i(1) ; i<=n ; i=-~i){
        update(a[i].num,1);
        ans += i-query(a[i].num);
    }
    printf("%lld",ans);
    return 0;
}

mason:

#include<bits/stdc++.h>
using namespace std;
int f[1001],p,res[1001],sav[1001];
void result_1(){
    memset(sav,0,sizeof(sav));
    for(register int i=1;i<=500;i+=1)
        for(register int j=1;j<=500;j+=1)
            sav[i+j-1]+=res[i]*f[j];
    for(register int i=1;i<=500;i+=1){
        sav[i+1]+=sav[i]/10;
        sav[i]%=10;
    }
    memcpy(res,sav,sizeof(res));
}
void result_2(){
    memset(sav,0,sizeof(sav));
    for(register int i=1;i<=500;i+=1)
        for(register int j=1;j<=500;j+=1)
            sav[i+j-1]+=f[i]*f[j];
    for(register int i=1;i<=500;i+=1){
        sav[i+1]+=sav[i]/10;
        sav[i]%=10;
    }
    memcpy(f,sav,sizeof(f));
}
int main(){
    freopen("mason.in","r",stdin);
    freopen("mason.out","w",stdout);
    scanf("%d",&p);
    printf("%d\n",(int)(log10(2)*p+1));
    res[1]=1;
    f[1]=2;
    while(p!=0){
        if(p%2==1)result_1();
        p/=2;
        result_2();
    }
    res[1]-=1;
    for(register int i=500;i>=1;i-=1)
        if(i!=500&&i%50==0)printf("\n%d",res[i]);
        else printf("%d",res[i]);
    return 0;
}

 

posted @ 2022-03-22 22:12  LZMiiu  阅读(19)  评论(0编辑  收藏  举报