UOJ#73. 【WC2015】未来程序 提交答案题
原文链接www.cnblogs.com/zhouzhendong/p/UOJ73.html
前言
纯属理性愉悦。
题解
Subtask1
发现就是求 $a \times b \mod c $ 。
写个快速乘就好了。
Subtask2
直接打开的话会发现 gedit 卡死了。
用 Subline Text 开开看了看好像没什么特别的。
看看这份代码的长度,怎么这么大?
仔细看会发现下面有一行注释起来的英文,不知道干什么的。先记着。
这一个子任务显然是个线性递推。大力矩阵快速幂即可。
Subtask3
这次要求
$$s0 = \sum_{i=0}^{n} i ^ 0 \\ s1 = \sum_{i=0}^{n} i ^ 1 \\ s2 = \sum_{i=0}^{n} i ^ 2 \\ s3 = \sum_{i=0}^{n} i ^ 3 \\ s4 = \sum_{i=0}^{n} i ^ 4 $$
显然
$$ s0 = n + 1 \\ s1 = \frac{n(n+1)}{2} \\ s2 = \frac{n(n+1)(2n+1)}{6} \\ s3 = \left (\frac{n(n+1)}{2}\right)^2$$
然后 $s4$ 我就不知道了。
显然它是一个 5 次多项式。写个代码插一下值就好了。
然而我选择了 OEIS 。事实证明我错了,因为后面的 Subtask 要用到插值,在这时写插值对 AC 此题而言并不是徒劳。
$$ s4 = \frac{n(n+1) (2n+1)(3n^2 + 3n-1)}{30}$$
Subtask4
这个子任务可以分成两部分。
第一部分直接统计一下点的个数然后简单计算即可。
第二部分,就是求出每一个值为 1 的点到曼哈顿距离最近的 0 的曼哈顿距离和,考虑对 左上、右上、左下、右下 四个方向分开贪心,求一下二维前缀 min 即可。
时间复杂度 $O(n ^ 2) $ 。
Subtask5
任务:给定一个 $n\times m$ 的 01 矩阵。
求全 1 子矩阵个数。
显然单调栈直接搞就好了。
时间复杂度 $O(n^2 )$ 。
Subtask6
看起来显然不能直接暴力。
稍加思索可以发现这很有可能会有环。
大力写个 Floyd 判环试试!
好像有几个点跑不出来啊!
多等一会儿就跑出来了。
大约 1 分钟。
Subtask7
wtf这这这……解数独只有 10 分?
wtf还限制枚举顺序?
为了保证枚举顺序的正确,我大力写了一个奇怪的 DLX ,结果它根本跑不出来。
然后我发现我丝薄了,只要正常 DLX,然后求字典序最小的就好了。
跑的飞快。
Subtask8
这,第一个点可以直接算了,显然是个组合数。
这,直接暴力求小的数,然后插值是不是就好了。
结果我把一个 j 打成了 i 调了半个小时。
Subtask9
这还有选择题。
第一题不会,百度告诉我是1984。
第二题CLY猜123456,他猜对了。
第三题chenlijie,不要问我是怎么知道的。
第四题,暴搜即可。
第5/6/7/8题,它说答案是一个单词。记得在Subtask2 里好像有一个注释起来的东西,我们称它为字典,拿来看看!wow,全是单词!要不从这里搜一搜试试?——恭喜得到4分。
第九题,答案是两个单词,我猜也在字典里面。分析了一下字典中的信息,发现里面有不到110000个单词,而且短的单词个数很少。这个题的两个单词长度总和不超过 6(还有一个空格),所以把所有单词读进来,按照长度排个序,搜一下发现搜出来了。
第十题,感觉也是能搜了。因为长度不超过11的单词对数好像是1e8级别的。搜了一下,大约1分钟就搜出来了。
Subtask10
这这这,是什么玩意儿?
发现代码不大能看。
但是很有规律啊!
写个代码专门解释一下这份代码顺便优化一下就好了。
代码及附加文件
提供萌萌哒的附件:包含解决这题的代码、下发的10份暴力代码、下发的10份输入文件 以及 答案文件。
链接:problem_73
代码说明:
在与本代码同级目录下建立文件夹"i",并将下发的输入文件依次命名为 1.in 2,in 3.in ... ,存在文件夹 i 中。
在与本代码同级目录下建立文件夹"o",程序运行结果将会保存到文件夹 o 中。
复制暴力代码中的第 10 份代码到本代码同级目录下,并重命名为 10.cpp
在与文代码同级目录下建立一个文本文件,命名为 Dictionary,没有后缀,将暴力代码中的第 2 分代码中的注释部分复制到文本文件 Dictionary 中(不包括注释符号,只包括单词),并保存。
具体细节见附加文件。
按照上述说明执行后,就可以正常运行以下代码并得到本题答案。注意编译的时候要加上 -DpAll
也就是
g++ -o x 1.cpp -DpAll
#pragma GCC optimize("Ofast","inline") #include <bits/stdc++.h> #define clr(x) memset(x,0,sizeof (x)) #define For(i,a,b) for (int i=a;i<=b;i++) #define Fod(i,b,a) for (int i=b;i>=a;i--) #define pb(x) push_back(x) #define mp(x,y) make_pair(x,y) #define fi first #define se second #define _SEED_ ('C'+'L'+'Y'+'A'+'K'+'I'+'O'+'I') #define outval(x) printf(#x" = %d\n",x) #define outvec(x) printf("vec "#x" = ");for (auto _v : x)printf("%d ",_v);puts("") #define outtag(x) puts("----------"#x"----------") #define outarr(a,L,R) printf(#a"[%d...%d] = ",L,R);\ For(_v2,L,R)printf("%d ",a[_v2]);puts(""); using namespace std; typedef long long LL; typedef unsigned long long ULL; typedef vector <int> vi; LL read(){ LL x=0,f=0; char ch=getchar(); while (!isdigit(ch)) f|=ch=='-',ch=getchar(); while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); return f?-x:x; } #define OPEN(x) (cerr<<"Subtask "#x<<endl),freopen("i/"#x".in","r",stdin),freopen("o/program"#x".out","w",stdout) namespace P1{ int main(){ OPEN(1); For(i,1,10){ cerr<<"Test "<<i<<endl; ULL a,b,c; cin>>a>>b>>c; // a * b % c ULL ans=0; for (;b;b>>=1,a=(a+a)%c) if (b&1) ans=(ans+a)%c; cout<<ans<<endl; } return 0; } } namespace P2{ LL n,mod; void Add(LL &x,LL y){ if ((x+=y)>=mod) x-=mod; } void Del(LL &x,LL y){ if ((x-=y)<0) x+=mod; } struct Mat{ LL v[3][3]; Mat(){} Mat(LL _x){ clr(v); For(i,0,2) v[i][i]=_x; } friend Mat operator * (Mat a,Mat b){ Mat c(0); For(i,0,2) For(j,0,2) For(k,0,2) Add(c.v[i][j],(LL)a.v[i][k]*b.v[k][j]%mod); return c; } friend Mat operator ^ (Mat x,LL y){ Mat ans(1); for (;y;y>>=1,x=x*x) if (y&1) ans=ans*x; return ans; } }M(0),A; int main(){ OPEN(2); For(i,1,10){ cerr<<"Test "<<i<<endl; n=read(),mod=read(); M.v[0][0]=1%mod; M.v[1][0]=2%mod; M.v[2][0]=1%mod; M.v[0][1]=1%mod; M.v[1][1]=1%mod; M.v[0][2]=1%mod; A=Mat(0); A.v[0][0]=1%mod; A=A*(M^n); LL res=(A.v[0][0]-A.v[0][1]*2+A.v[0][2])%mod; res=(res+mod)%mod; cout<<res<<endl; } return 0; } } namespace P3{ unsigned long long s0,s1,s2,s3,s4,i,n; int main(){ OPEN(3); cin>>n; s0=n+1; s1=n/2*(n+1); s2=n/2*(n+1)*(((n*2)+1)/3); s3=n/2*(n+1),s3*=s3; s4=n/10*(n+1)*((n*2+1)/3)*(3*n+3*n*n-1); cout<<s0<<endl<<s0<<endl<<s1<<endl<<s1<<endl<<s2<<endl <<s2<<endl<<s3<<endl<<s3<<endl<<s4<<endl<<s4<<endl; return 0; } } namespace P4{ const int N=5005,INF=0x3F3F3F3F; int n,m,type; int seed; int Rand(){ static const int P=1e9+7,Q=83978833,R=8523467; return seed=((LL)Q*seed%P*seed+R)%P; } int a[N][N]; void Input(){ n=read(),m=read(),type=read(); For(i,1,n) For(j,1,m) a[i][j]=bool((Rand()%8)>0); } LL count1(){ LL ans=0; For(i,1,n) For(j,1,m) if (a[i][j]) ans++; return ans*(ans-1); } int v1[N][N],v2[N][N],v3[N][N],v4[N][N]; void ckmin(int &a,int b){ a=min(a,b); } LL count2(){ For(i,0,n+1) For(j,0,n+1) v1[i][j]=v2[i][j]=v3[i][j]=v4[i][j]=INF; For(i,1,n) For(j,1,n){ if (!a[i][j]) v1[i][j]=-i-j; ckmin(v1[i][j],v1[i-1][j]); ckmin(v1[i][j],v1[i][j-1]); } For(i,1,n) Fod(j,n,1){ if (!a[i][j]) v2[i][j]=-i+j; ckmin(v2[i][j],v2[i-1][j]); ckmin(v2[i][j],v2[i][j+1]); } Fod(i,n,1) For(j,1,n){ if (!a[i][j]) v3[i][j]=+i-j; ckmin(v3[i][j],v3[i+1][j]); ckmin(v3[i][j],v3[i][j-1]); } Fod(i,n,1) Fod(j,n,1){ if (!a[i][j]) v4[i][j]=+i+j; ckmin(v4[i][j],v4[i+1][j]); ckmin(v4[i][j],v4[i][j+1]); } LL ans=0; For(i,1,n) For(j,1,n) if (a[i][j]) ans+=min(min(v1[i][j]+i+j,v2[i][j]+i-j) ,min(v3[i][j]-i+j,v4[i][j]-i-j)); return ans; } int main(){ OPEN(4); seed=read(); For(i,1,10){ cerr<<"Test "<<i<<endl; Input(); cout<<(type==1?count2():count1())<<endl; } return 0; } } namespace P5{ const int N=5005,INF=0x3F3F3F3F; int n,m,type; int seed; int Rand(){ static const int P=1e9+7,Q=83978833,R=8523467; return seed=((LL)Q*seed%P*seed+R)%P; } int a[N][N]; void Input(){ n=read(),m=read(); For(i,1,n) For(j,1,m) a[i][j]=bool((Rand()%8)>0); } int h[N][N]; int len[N],H[N],top; LL count3(){ For(i,0,n) For(j,0,n+1) h[i][j]=0; For(i,1,n) For(j,1,n) if (a[i][j]) h[i][j]=h[i-1][j]+1; else h[i][j]=0; LL ans=0; For(i,1,n){ len[0]=H[0]=top=0; For(j,1,n+1){ int now=1; while (top>0&&H[top]>=h[i][j]){ if (H[top-1]>=h[i][j]){ ans+=(LL)len[top]*(len[top]+1)/2*(H[top]-H[top-1]); len[top-1]+=len[top]; top--; } else { ans+=(LL)len[top]*(len[top]+1)/2*(H[top]-h[i][j]); now+=len[top]; top--; } } top++; len[top]=now,H[top]=h[i][j]; } // cerr<<"i = "<<i<<endl; } return ans; } int main(){ OPEN(5); seed=read(); For(i,1,10){ cerr<<"Test "<<i<<endl; Input(); cout<<count3()<<endl; } return 0; } } namespace P6{ ULL a,b,c,t,k,n; ULL rd(ULL &t){ t=(t*t*a+b)%c; return t; } int main(){ OPEN(6); For(i,1,10){ //it tasks about 1 minute to solve Test 8 cerr<<"Test "<<i<<endl; cin>>n>>a>>b>>c; k=0; ULL t=0,t1=0; do { rd(t); rd(t1); rd(t1); k++; } while (k<=n&&t!=t1); ULL k2=0; do { rd(t); rd(t1); rd(t1); k2++; if (t==t1) break; } while (k+k2<=n); if (t==t1){ n-=k-k2; n%=k2; while (n--) rd(t); } cout<<t<<endl; } return 0; } } namespace P7{ const int N=18; int n=16; char g[N][N]; char ans[N*N]; namespace DLX{ const int N=16*16*16+5,M=16*16*4+5,S=N*4+M+N; int n,m,cnt; int x[S],y[S],U[S],D[S],L[S],R[S],C[M]; char now[N]; void init(int _n,int _m){ n=_n,m=_m; cnt=m; clr(U),clr(D),clr(L),clr(R),clr(C); For(i,0,m) L[i]=i-1,R[i]=i+1,D[i]=U[i]=i; L[0]=m,R[m]=0; } void Link(int i,int j){ cnt++,x[cnt]=i,y[cnt]=j; L[cnt]=cnt-1,R[cnt]=cnt+1; D[cnt]=j,D[U[j]]=cnt,U[cnt]=U[j],U[j]=cnt; C[j]++; } void Delete(int k){ L[R[k]]=L[k],R[L[k]]=R[k]; for (int i=D[k];i!=k;i=D[i]) for (int j=R[i];j!=i;j=R[j]) U[D[j]]=U[j],D[U[j]]=D[j],C[y[j]]--; } void Reset(int k){ L[R[k]]=R[L[k]]=k; for (int i=U[k];i!=k;i=U[i]) for (int j=L[i];j!=i;j=L[j]) U[D[j]]=D[U[j]]=j,C[y[j]]++; } int check(){ For(i,1,256) if (now[i]=='Y') return 1; else if (now[i]>ans[i]) return 0; return 1; } int checkord(){ For(i,1,256) if (ans[i]!=now[i]) return now[i]<ans[i]; return 0; } int solve(){ /* if (!check()) return 0;*/ if (!R[0]){ if (checkord()) For(i,1,256) ans[i]=now[i]; return 1; } int k=R[0]; for (int i=R[0];i;i=R[i]) if (C[i]<C[k]) k=i; Delete(k); int ans=0; for (int i=D[k];i!=k;i=D[i]){ int r=x[i]; now[(r-1)/16+1]='A'+(r-1)%16; for (int j=R[i];j!=i;j=R[j]) Delete(y[j]); ans|=solve(); for (int j=L[i];j!=i;j=L[j]) Reset(y[j]); now[(r-1)/16+1]='Y'; } Reset(k); return ans; } } int a[N][N]; int Hash(int x,int y,int z){ return x*16*16+(y-1)*16+z; } int solve(int po){ For(i,1,n) scanf("%s",g[i]+1); For(i,1,n) For(j,1,n) if (isupper(g[i][j])) a[i][j]=g[i][j]-'A'+1; else a[i][j]=0; DLX::init(16*16*16,16*16*4); For(i,1,16) For(j,1,16) For(k,1,16){ int r=(i-1)*16*16+(j-1)*16+k; if (!a[i][j]||a[i][j]==k){ int fir=DLX::cnt+1; DLX::Link(r,Hash(0,i,j)); DLX::Link(r,Hash(1,i,k)); DLX::Link(r,Hash(2,j,k)); DLX::Link(r,Hash(3,(i-1)/4*4+(j-1)/4+1,k)); DLX::L[fir]=DLX::cnt; DLX::R[DLX::cnt]=fir; } } For(i,1,n) For(j,1,n){ ans[(i-1)*n+j]='Z'; DLX::now[(i-1)*n+j]='Y'; } int f=DLX::solve(); For(i,1,po){ if (!f) puts("NO SOLUTION."); else { For(i,1,16){ For(j,1,16) putchar(ans[(i-1)*16+j]); } } puts(""); } } int main(){ OPEN(7); cerr<<"Test 1"<<endl; solve(1); cerr<<"Test 2"<<endl; solve(2); cerr<<"Test 3"<<endl; solve(3); cerr<<"Test 4"<<endl; solve(4); return 0; } } namespace P8{ const LL mod=1234567891; namespace brute{ unsigned long long a,b,c,d,e,f,g,n,q,r,s,t,u,v,w,x,y,z; unsigned long long p=mod; int main(int n,LL *A){ a=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,a=0; while (a<n){ a=a+1,b=0; while (b<n){ b=b+1,c=0; while (c<n){ c=c+1,d=0; while (d<n){ d=d+1,e=0; while (e<n){ e=e+1,f=0; while (f<n){ f=f+1,g=0; while (g<n){ g=g+1; if (a<b&&b<c&&c<d&&d<e&&e<f&&f<g) q=(q+1)%p; if (a<b&&c<g&&c<d&&e<f&&a<d) r=(r+1)%p; if (a<d&&d<f&&c<f&&c<e&&b<d) s=(s+1)%p; if (d<e&&b<d&&a<f&&d<e&&b<g) t=(t+1)%p; if (c<f&&b<f&&b<c&&f<g&&b<f) u=(u+1)%p; if (b<d&&b<c&&d<f&&c<e&&b<e) v=(v+1)%p; if (a<c&&a<b&&c<e&&b<f&&e<g) w=(w+1)%p; if (b<d&&b<f&&a<g&&c<g&&a<e) x=(x+1)%p; if (b<f&&a<c&&c<d&&a<c&&b<e) y=(y+1)%p; if (d<e&&e<f&&a<d&&c<g&&b<d) z=(z+1)%p; } } } } } } } A[0]=q; A[1]=r; A[2]=s; A[3]=t; A[4]=u; A[5]=v; A[6]=w; A[7]=x; A[8]=y; A[9]=z; return 0; } } const int N=15; LL a[N][N]; LL v[N],f[N],F[N],G[N]; void Add(LL &x,LL y){ if ((x+=y)>=mod) x-=mod; } void Del(LL &x,LL y){ if ((x-=y)<0) x+=mod; } LL Pow(LL x,LL y){ LL ans=1; for (;y;y>>=1,x=(LL)x*x%mod) if (y&1) ans=(LL)ans*x%mod; return ans; } int Calc(int id,int n,int xv){ clr(v),clr(f); For(i,0,n-1) v[i]=a[i][id]; For(i,0,n-1){ clr(F); LL tmp=F[0]=1; For(j,0,n-1) if (i!=j) F[0]=(LL)F[0]*(i-j+mod)%mod; F[0]=(LL)v[i]*Pow(F[0],mod-2)%mod; For(j,0,n-1) if (i!=j){ clr(G); For(k,0,n-1){ Add(G[k+1],F[k]); Del(G[k],(LL)F[k]*j%mod); } For(k,0,n-1) F[k]=G[k]; } For(j,0,n-1) Add(f[j],F[j]); } LL tmp=1,res=0; For(i,0,n-1){ Add(res,(LL)tmp*f[i]%mod); tmp=(LL)tmp*xv%mod; } return res; } int main(){ OPEN(8); LL n=read()%mod; For(i,0,7) brute::main(i,a[i]); For(i,1,10){ cerr<<"Test "<<i<<endl; cout<<Calc(i-1,8,n)<<endl; } return 0; } } namespace P9{ typedef unsigned char UC; namespace MD5{ #include <stdio.h> #include <stdlib.h> #include <memory.h> typedef struct{ unsigned int count[2]; unsigned int state[4]; unsigned char buffer[64]; }MD5_CTX; #define F(x,y,z) ((x & y) | (~x & z)) #define G(x,y,z) ((x & z) | (y & ~z)) #define H(x,y,z) (x^y^z) #define I(x,y,z) (y ^ (x | ~z)) #define ROTATE_LEFT(x,n) ((x << n) | (x >> (32-n))) #define FF(a,b,c,d,x,s,ac) \ { \ a += F(b,c,d) + x + ac; \ a = ROTATE_LEFT(a,s); \ a += b; \ } #define GG(a,b,c,d,x,s,ac) \ { \ a += G(b,c,d) + x + ac; \ a = ROTATE_LEFT(a,s); \ a += b; \ } #define HH(a,b,c,d,x,s,ac) \ { \ a += H(b,c,d) + x + ac; \ a = ROTATE_LEFT(a,s); \ a += b; \ } #define II(a,b,c,d,x,s,ac) \ { \ a += I(b,c,d) + x + ac; \ a = ROTATE_LEFT(a,s); \ a += b; \ } void MD5Init(MD5_CTX *context); void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen); void MD5Final(MD5_CTX *context,unsigned char digest[16]); void MD5Transform(unsigned int state[4],unsigned char block[64]); void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len); void MD5Decode(unsigned int *output,unsigned char *input,unsigned int len); unsigned char PADDING[]={0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; void MD5Init(MD5_CTX *context){ context->count[0] = 0; context->count[1] = 0; context->state[0] = 0x67452301; context->state[1] = 0xEFCDAB89; context->state[2] = 0x98BADCFE; context->state[3] = 0x10325476; } void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen){ unsigned int i = 0,index = 0,partlen = 0; index = (context->count[0] >> 3) & 0x3F; partlen = 64 - index; context->count[0] += inputlen << 3; if(context->count[0] < (inputlen << 3)) context->count[1]++; context->count[1] += inputlen >> 29; if(inputlen >= partlen){ memcpy(&context->buffer[index],input,partlen); MD5Transform(context->state,context->buffer); for(i = partlen;i+64 <= inputlen;i+=64) MD5Transform(context->state,&input[i]); index = 0; } else i = 0; memcpy(&context->buffer[index],&input[i],inputlen-i); } void MD5Final(MD5_CTX *context,unsigned char digest[16]){ unsigned int index = 0,padlen = 0; unsigned char bits[8]; index = (context->count[0] >> 3) & 0x3F; padlen = (index < 56)?(56-index):(120-index); MD5Encode(bits,context->count,8); MD5Update(context,PADDING,padlen); MD5Update(context,bits,8); MD5Encode(digest,context->state,16); } void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len){ unsigned int i = 0,j = 0; while(j < len){ output[j] = input[i] & 0xFF; output[j+1] = (input[i] >> 8) & 0xFF; output[j+2] = (input[i] >> 16) & 0xFF; output[j+3] = (input[i] >> 24) & 0xFF; i++; j+=4; } } void MD5Decode(unsigned int *output,unsigned char *input,unsigned int len){ unsigned int i = 0,j = 0; while(j < len){ output[i] = (input[j]) | (input[j+1] << 8) | (input[j+2] << 16) | (input[j+3] << 24); i++; j+=4; } } void MD5Transform(unsigned int state[4],unsigned char block[64]){ unsigned int a = state[0]; unsigned int b = state[1]; unsigned int c = state[2]; unsigned int d = state[3]; unsigned int x[64]; MD5Decode(x,block,64); FF(a, b, c, d, x[ 0], 7, 0xd76aa478); /* 1 */ FF(d, a, b, c, x[ 1], 12, 0xe8c7b756); /* 2 */ FF(c, d, a, b, x[ 2], 17, 0x242070db); /* 3 */ FF(b, c, d, a, x[ 3], 22, 0xc1bdceee); /* 4 */ FF(a, b, c, d, x[ 4], 7, 0xf57c0faf); /* 5 */ FF(d, a, b, c, x[ 5], 12, 0x4787c62a); /* 6 */ FF(c, d, a, b, x[ 6], 17, 0xa8304613); /* 7 */ FF(b, c, d, a, x[ 7], 22, 0xfd469501); /* 8 */ FF(a, b, c, d, x[ 8], 7, 0x698098d8); /* 9 */ FF(d, a, b, c, x[ 9], 12, 0x8b44f7af); /* 10 */ FF(c, d, a, b, x[10], 17, 0xffff5bb1); /* 11 */ FF(b, c, d, a, x[11], 22, 0x895cd7be); /* 12 */ FF(a, b, c, d, x[12], 7, 0x6b901122); /* 13 */ FF(d, a, b, c, x[13], 12, 0xfd987193); /* 14 */ FF(c, d, a, b, x[14], 17, 0xa679438e); /* 15 */ FF(b, c, d, a, x[15], 22, 0x49b40821); /* 16 */ /* Round 2 */ GG(a, b, c, d, x[ 1], 5, 0xf61e2562); /* 17 */ GG(d, a, b, c, x[ 6], 9, 0xc040b340); /* 18 */ GG(c, d, a, b, x[11], 14, 0x265e5a51); /* 19 */ GG(b, c, d, a, x[ 0], 20, 0xe9b6c7aa); /* 20 */ GG(a, b, c, d, x[ 5], 5, 0xd62f105d); /* 21 */ GG(d, a, b, c, x[10], 9, 0x2441453); /* 22 */ GG(c, d, a, b, x[15], 14, 0xd8a1e681); /* 23 */ GG(b, c, d, a, x[ 4], 20, 0xe7d3fbc8); /* 24 */ GG(a, b, c, d, x[ 9], 5, 0x21e1cde6); /* 25 */ GG(d, a, b, c, x[14], 9, 0xc33707d6); /* 26 */ GG(c, d, a, b, x[ 3], 14, 0xf4d50d87); /* 27 */ GG(b, c, d, a, x[ 8], 20, 0x455a14ed); /* 28 */ GG(a, b, c, d, x[13], 5, 0xa9e3e905); /* 29 */ GG(d, a, b, c, x[ 2], 9, 0xfcefa3f8); /* 30 */ GG(c, d, a, b, x[ 7], 14, 0x676f02d9); /* 31 */ GG(b, c, d, a, x[12], 20, 0x8d2a4c8a); /* 32 */ /* Round 3 */ HH(a, b, c, d, x[ 5], 4, 0xfffa3942); /* 33 */ HH(d, a, b, c, x[ 8], 11, 0x8771f681); /* 34 */ HH(c, d, a, b, x[11], 16, 0x6d9d6122); /* 35 */ HH(b, c, d, a, x[14], 23, 0xfde5380c); /* 36 */ HH(a, b, c, d, x[ 1], 4, 0xa4beea44); /* 37 */ HH(d, a, b, c, x[ 4], 11, 0x4bdecfa9); /* 38 */ HH(c, d, a, b, x[ 7], 16, 0xf6bb4b60); /* 39 */ HH(b, c, d, a, x[10], 23, 0xbebfbc70); /* 40 */ HH(a, b, c, d, x[13], 4, 0x289b7ec6); /* 41 */ HH(d, a, b, c, x[ 0], 11, 0xeaa127fa); /* 42 */ HH(c, d, a, b, x[ 3], 16, 0xd4ef3085); /* 43 */ HH(b, c, d, a, x[ 6], 23, 0x4881d05); /* 44 */ HH(a, b, c, d, x[ 9], 4, 0xd9d4d039); /* 45 */ HH(d, a, b, c, x[12], 11, 0xe6db99e5); /* 46 */ HH(c, d, a, b, x[15], 16, 0x1fa27cf8); /* 47 */ HH(b, c, d, a, x[ 2], 23, 0xc4ac5665); /* 48 */ /* Round 4 */ II(a, b, c, d, x[ 0], 6, 0xf4292244); /* 49 */ II(d, a, b, c, x[ 7], 10, 0x432aff97); /* 50 */ II(c, d, a, b, x[14], 15, 0xab9423a7); /* 51 */ II(b, c, d, a, x[ 5], 21, 0xfc93a039); /* 52 */ II(a, b, c, d, x[12], 6, 0x655b59c3); /* 53 */ II(d, a, b, c, x[ 3], 10, 0x8f0ccc92); /* 54 */ II(c, d, a, b, x[10], 15, 0xffeff47d); /* 55 */ II(b, c, d, a, x[ 1], 21, 0x85845dd1); /* 56 */ II(a, b, c, d, x[ 8], 6, 0x6fa87e4f); /* 57 */ II(d, a, b, c, x[15], 10, 0xfe2ce6e0); /* 58 */ II(c, d, a, b, x[ 6], 15, 0xa3014314); /* 59 */ II(b, c, d, a, x[13], 21, 0x4e0811a1); /* 60 */ II(a, b, c, d, x[ 4], 6, 0xf7537e82); /* 61 */ II(d, a, b, c, x[11], 10, 0xbd3af235); /* 62 */ II(c, d, a, b, x[ 2], 15, 0x2ad7d2bb); /* 63 */ II(b, c, d, a, x[ 9], 21, 0xeb86d391); /* 64 */ state[0] += a; state[1] += b; state[2] += c; state[3] += d; } } using namespace MD5; void getMD5(char *IN,int *OU){ static UC s[233],t[233]; clr(s),clr(t); int len=strlen(IN); For(i,0,len-1) s[i]=IN[i]; MD5_CTX md5; MD5Init(&md5); MD5Update(&md5,s,len); MD5Final(&md5,t); int l2=strlen((char *)t); For(i,0,l2-1) OU[i]=t[i]; } void readMD5(int *a){ For(i,0,15) scanf("%2x",&a[i]); } int cmpMD5(int *a,int *b){ For(i,0,15) if (a[i]!=b[i]) return 0; return 1; } void outMD5(int *a){ For(i,0,15) printf("%02x",a[i]); puts(""); } ifstream Dic; char ans[13][233]={ "", "1984", "123456", "chenlijie", "", "", "", "", "", "", "" }; int Dic_cnt(){ int len[30]; char s[233]; int res=0,Mxlen=0; clr(len); Dic.open("Dictionary"); while (Dic>>s){ res++; Mxlen=max(Mxlen,(int)strlen(s)); len[(int)strlen(s)]++; } Dic.close(); // outval(Mxlen); // outarr(len,1,28); return res; } int a[20],b[20]; const int N=110000; int n; char word[N][30]; int len[N]; bool cmp(int a,int b){ return len[a]<len[b]; } void GetWord(){ static char s[N][30]; static int id[N]; clr(s),clr(id),clr(len); n=0; Dic.open("Dictionary"); while (Dic>>s[0]){ n++; id[n]=n; len[n]=strlen(s[0]); For(i,0,len[n]-1) s[n][i]=s[0][i]; } Dic.close(); // sort(id+1,id+n+1,[&](int a,int b){return len[a]<len[b];}); sort(id+1,id+n+1,cmp); For(i,1,n) For(j,0,len[id[i]]-1) word[i][j]=s[id[i]][j]; For(i,1,n) len[i]=strlen(word[i]); } int main(){ // freopen("i/9.in","r",stdin); OPEN(9); // cout<<Dic_cnt()<<endl; GetWord(); For(T,1,10){ cerr<<"Test "<<T<<endl; if (T<=3){ readMD5(a); getMD5(ans[T],b); assert(cmpMD5(a,b)); puts(ans[T]); } else if (T==4){ readMD5(a); int flag=0; For(i,32,126){ For(j,32,126){ For(k,32,126){ ans[T][0]=i,ans[T][1]=j,ans[T][2]=k; getMD5(ans[T],b); if (cmpMD5(a,b)){ flag=1; break; } } if (flag) break; } if (flag) break; } assert(flag); puts(ans[T]); } else if (T<=8){ Dic.open("Dictionary"); readMD5(a); int flag=0; while (Dic>>ans[T]){ getMD5(ans[T],b); if (cmpMD5(a,b)){ flag=1; break; } } assert(flag); puts(ans[T]); Dic.close(); } else if (T==9){ readMD5(a); int flag=0; For(i,1,n){ For(j,i+1,n){ if (len[i]+len[j]+1>7) break; clr(ans[T]); For(k,0,len[i]-1) ans[T][k]=word[i][k]; ans[T][len[i]]=' '; For(k,0,len[j]-1) ans[T][len[i]+1+k]=word[j][k]; getMD5(ans[T],b); if (cmpMD5(a,b)){ flag=1; break; } clr(ans[T]); For(k,0,len[j]-1) ans[T][k]=word[j][k]; ans[T][len[j]]=' '; For(k,0,len[i]-1) ans[T][len[j]+1+k]=word[i][k]; getMD5(ans[T],b); if (cmpMD5(a,b)){ flag=1; break; } } if (flag) break; } assert(flag); puts(ans[T]); } else {// it takes about 1 minute to find out this answer readMD5(a); int flag=0; For(i,1,n){ For(j,i+1,n){ if (len[i]+len[j]>11) break; clr(ans[T]); For(k,0,len[i]-1) ans[T][k]=word[i][k]; For(k,0,len[j]-1) ans[T][len[i]+k]=word[j][k]; getMD5(ans[T],b); if (cmpMD5(a,b)){ flag=1; break; } clr(ans[T]); For(k,0,len[j]-1) ans[T][k]=word[j][k]; For(k,0,len[i]-1) ans[T][len[j]+k]=word[i][k]; getMD5(ans[T],b); if (cmpMD5(a,b)){ flag=1; break; } } if (flag) break; } assert(flag); puts(ans[T]); } } return 0; } } namespace P10{ ifstream Code; map <string,ULL> C; char s[1000000]; int n=0; int cmp(char *a,string b){ int len=b.size(); For(i,0,len-1) if (a[i]!=b[i]) return 0; return 1; } int Next_void(int it){ while (!cmp(s+it,"void")&&!cmp(s+it,"main")) it++; return cmp(s+it,"void")?it+4:it; } int isvoid(char c){ return c=='_'||isupper(c); } int main(){ OPEN(10); // freopen("i/10.in","r",stdin); Code.open("10.cpp"); string str; n=1; while (getline(Code,str)){ int len=str.size(); For(i,0,len-1) s[n+i]=str[i]; n+=len; s[n++]='\n'; } Code.close(); // puts(s+1); C.clear(); int it=Next_void(1); C["_"]=1; while (!cmp(s+(it=Next_void(it)),"main")){ ULL val=0; string now=""; while (!isvoid(s[it])) it++; do { now+=s[it]; } while (isvoid(s[++it])); while (s[it]!='}'){ while (!isvoid(s[it])&&s[it]!='}') it++; if (isvoid(s[it])){ string sub=""; do { sub+=s[it]; } while (isvoid(s[++it])); val+=C[sub]; } } C[now]=val; // cout<<"void "<<now<<"() = "<<val<<endl; } ULL tmp3=0,tmp2=0; int cnt=0; while (!cmp(s+it,"return")){ if (cmp(s+it,"scanf")){ cin>>tmp3; cerr<<"Test "<<++cnt<<endl; } else if (cmp(s+it,"= 0")) tmp2=0; else if (isvoid(s[it])){ string now=""; do { now+=s[it]; } while (isvoid(s[++it])); tmp2+=C[now]; } else if (cmp(s+it,"printf")) cout<<tmp2*tmp3<<endl; it++; } return 0; } } int main(){ #ifdef pAll P1::main(); P2::main(); P3::main(); P4::main(); P5::main(); P6::main(); P7::main(); P8::main(); P9::main(); P10::main(); #else #ifdef p1 P1::main(); #endif #ifdef p2 P2::main(); #endif #ifdef p3 P3::main(); #endif #ifdef p4 P4::main(); #endif #ifdef p5 P5::main(); #endif #ifdef p6 P6::main(); #endif #ifdef p7 P7::main(); #endif #ifdef p8 P8::main(); #endif #ifdef p9 P9::main(); #endif #ifdef p10 P10::main(); #endif #endif return 0; }