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]);
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 ",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); */
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 ",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 */