1. 程式人生 > 其它 >2022/3/22 equation,binary,deseq和mason

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;
}