day23
最后一天做题了吧,也没留下什么遗憾。
T1模拟了一波,听起来和正解好像差不多,但是又WA又TLE我佛了;
T2考场AC了,找一下规律就可以发现是杨辉三角,写个高精就能过,好像还能用组合数做?我不知道;
顺带一提,那个$x^x$最好用快速幂,不然可能很慢
T3由于我不擅长图论,考场看到就弃了,打第二题了正解是最短路+DP吧。。。
T4数据结构题,暴力了20分
总得分30+100+0+20=150;
还挺好的,rank又回到了前40
我%%%%%%,
考场傻逼了,敲的正解却把往前算的个数算错了。
往前$2^i$我变成了$2*i$;
还tm找了那么久错;
我快自闭了。
#include<iostream> #include<cstdio> #include<cctype> #include<algorithm> #include<cstring> using namespace std; inline double read() { int x=0,f=1;char c=getchar(); while(!isdigit(c)){if(c=='-')f=-1;c=getchar();} while(isdigit(c)){x=(x<<3)+(x<<1)+(c^48);c=getchar();} return double(x*f); } inline int poww(int x,int i) { int ans=1; while(i) { if(i&1)ans*=x; i>>=1; x*=x; } return ans; } double f[2000][2000]; double p[2000]; double a[2000]; int n; inline void updata(int x,int i,int sb) { if(!sb)sb=i; for(int j=1;j<=i;j++) { p[x]+=a[x]*a[i+j+x-sb]*f[x][i+j+x-sb]; p[i+j+x-sb]+=a[i+j+x-sb]*a[x]*f[i+j+x-sb][x]; } return; } int main() { n=read();int sbbb=poww(2,n); for(int i=1;i<=sbbb;i++)for(int j=1;j<=sbbb;j++)f[i][j]=read()/100; for(int i=1;i<=sbbb;i++)if(i&1)a[i]=f[i][i+1];else a[i]=f[i][i-1]; for(int i=1;i<n;i++) { for(int j=1;j<=sbbb;j++) { int z=poww(2,i); updata(j,z,j%z); if(!(j%z))j+=z; } memcpy(a,p,sizeof(p)); memset(p,0,sizeof(p)); } int manx; double maxx=-1; for(int i=1;i<=sbbb;i++) if(a[i]>maxx) { maxx=a[i];manx=i; } cout<<manx<<endl; return 0; }
压位高精
#include<iostream> #include<cstdio> #include<cctype> using namespace std; inline long long read() { long long x=0,f=1;char c=getchar(); while(!isdigit(c)){if(c=='-')f=-1;c=getchar();} while(isdigit(c)){x=(x<<3)+(x<<1)+(c^48);c=getchar();} return x*f; } long long xx,k; inline long long poww(long long x,long long i) { long long ans=1; while(i) { if(i&1)ans=(ans*x)%1000; i>>=1; x=(x*x)%1000; } return ans%1000; } long long f[1010][1010]; inline void jia(int x,int y) { for(int i=1;i<=max(f[x][0],f[y][0]);i++) f[x][i]+=f[y][i]; for(int i=1;i<=max(f[x][0],f[y][0]);i++) { if(f[x][i]>=100000000) { long long temp=f[x][i]/100000000; f[x][i]%=100000000; f[x][i+1]+=temp; } } if(f[x][f[x][0]+1])f[x][0]++; } int main() { k=read();xx=read(); xx=poww(xx%1000,xx); for(int i=1;i<=xx-k+1;i++)f[i][0]=f[i][1]=1; for(int i=1;i<k;i++) { for(int j=1;j<=xx-k+1;j++) jia(j,j-1); } int l=xx+1-k; printf("%lld",f[l][f[l][0]]); for(int i=f[l][0]-1;i>=1;i--) { printf("%lld",f[l][i]/10000000); printf("%lld",f[l][i]/1000000%10); printf("%lld",f[l][i]/100000%10); printf("%lld",f[l][i]/10000%10); printf("%lld",f[l][i]/1000%10); printf("%lld",f[l][i]/100%10); printf("%lld",f[l][i]/10%10); printf("%lld",f[l][i]%10); } return 0; }