纪念一下刷题量破百的倍数的日子

07 27

第四百道是用sbDP A的。。。

f[0][500][500]=1;
    int p=0;
    F(i,1,n){
        p^=1;
        F(j,1,999){
            f[p][j][500]=(f[p^1][j-1][500]+f[p^1][j+1][500])%mod;
            f[p][500][j]=(f[p^1][500][j-1]+f[p^1][500][j+1])%mod;
        }
        f[p][500][500]=(f[p^1][501][500]+f[p^1][499][500])%mod+(f[p^1][500][499]+f[p^1][500][501])%mod;
        f[p][500][500]%=mod;
        f[p][0][500]=f[p^1][1][500];
        f[p][500][0]=f[p^1][500][1];
        f[p][1000][0]=f[p^1][999][500];
        f[p][0][1000]=f[p^1][0][999];
    }
    printf("%d",f[n&1][500][500]);
View Code

 0907

第五百道是考试时候A的。考完以后挺长时间才发现自己都502了hhh

运用了数学课上自己去讲的一道题的小性质。路丽姐姐教你组合数。

测试39:工业题

#include<bits/stdc++.h>
#define F(i,a,b) for(rg int i=a;i<=b;++i)
#define rg register
#define LL long long
#define il inline
#define pf(a) printf("%lld ",a)
#define phn puts("")
using namespace std;
#define int LL
#define N 600010
int read();
int n,m,a,b;
int f[600010],g[600010],jc[N<<1],inv[N<<1],aj[N<<1],bj[N<<1];
const int mod=998244353;
il int qpow(int x,int k){x%=mod;int s=1;for(;k;x=x*x%mod,k>>=1)if(k&1)s=s*x%mod;return s;}
il int C(int a,int b){
    if(b>a)return 0;
    return jc[a]*inv[b]%mod*inv[a-b]%mod;
}
signed main(){
//    freopen("a_sample2.in","r",stdin);
    n=read();m=read();a=read()%mod;b=read()%mod;
    jc[0]=1;
    F(i,1,n+m)jc[i]=jc[i-1]*i%mod;
    inv[n+m]=qpow(jc[n+m],mod-2);
    for(int i=n+m;i>=1;--i)inv[i-1]=inv[i]*i%mod;
    aj[0]=bj[0]=1;
    F(i,1,n+m)aj[i]=aj[i-1]*a%mod,bj[i]=bj[i-1]*b%mod;
    rg int x=0,ans=0;
    F(i,1,n){
        x=read()%mod;
        ans+=x*C(m-1+n-i,m-1)%mod*aj[m]%mod*bj[n-i]%mod;
        ans%=mod;
    }
    F(i,1,m){
        x=read()%mod;
        ans+=x*C(n-1+m-i,n-1)%mod*aj[m-i]%mod*bj[n]%mod;
        ans%=mod;
    }
    printf("%lld\n",ans);
}
il int read(){
    int s=0;char ch;
    while(ch=getchar(),!isdigit(ch));
    for(;isdigit(ch);s=s*10+(ch^48),ch=getchar());
    return s;
}
/*
g++ 1.cpp -g
./a.out
4 4 3 2
1 3 5 7
2 4 6 8


*/
/*
int ans=0;
    ans+=8*16;
    ans+=6*5*16*3;
    ans+=4*15*16*9;
    ans+=2*35*16*27;
    ans+=1*35*8*81;
    ans+=3*15*4*81;
    ans+=5*5*2*81;
    ans+=7*1*81;
    pf(ans);
*/
View Code

 1014

第600道是大神题。思维题,但是代码简单。

#include<bits/stdc++.h>
#define F(i,a,b) for(int i=a;i<=b;++i)
#define LL long long
#define pf(a) printf("%d ",a) 
#define phn puts("")
using namespace std;
#define int LL
int n;
int a[5005],b[5005];
LL f[2][5005],g[5005];
const int mod=1e9+7;
void swap(int &x,int &y){int t=x;x=y;y=t;}
signed main(){
        scanf("%lld",&n);
        int las=1;
        int ok=1;
        F(i,1,n){
            scanf("%lld",&a[i]);++a[i];
            if(a[i]<i){
                if(las!=a[i]){ok=0;break;}
                b[a[i]]=1;
                las=i;
            }    
        }
        if(!ok)return puts("0"),0;
        f[1][1]=1;
        int s=0,p=1;
        F(i,2,n-1){
            p^=1;s=0;
            if(b[i]){
                for(int j=1;j<=i;++j){
                    f[p][j]=s;
                    s=(s+f[!p][j])%mod;
                }
        }
        else {
            for(int j=i-1;j>=1;--j){    
                s=(s+f[!p][j])%mod;
                f[p][j]=s;
            }
        }
        }
        int ans=0;
        F(j,1,n-1)ans=(ans+f[(n-1)&1][j])%mod;
        printf("%lld\n",ans);
}
/*
g++ 2.cpp 
./a.out
6
1 2 4 0 5 3
4
2 0 3 1
5
1 2 3 4 0
5
1 2 4 0 3
3
1 2 0
*/
测试71毛二琛

 

posted @ 2019-07-27 14:34  seamtn  阅读(195)  评论(2编辑  收藏  举报