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 .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;
}
UOJ#73. 【WC2015】未来程序 提交答案题的更多相关文章
- [WC2015]未来程序(提交答案)
		
sub1:ans=a*b%c,龟速乘即可. #include <stdio.h> #include <stdlib.h> unsigned long long a, b, c, ...
 - uoj #190. 【集训队互测2016】消失的源代码 提交答案题
		
Test 1: 发现是一个字母表的映射 把 \('a' \to 'z'\) 打进去找出映射就好了QAQ . Test 2: 求助 \(dalao\) 得知的点.. 答案是 : \(2016x^2 + ...
 - [UOJ#404][CTSC2018]组合数问题(79分,提交答案题,模拟退火+匈牙利+DP)
		
1.4.5.6.10都是op=1的点,除4外直接通过模拟退火调参可以全部通过. #include<cmath> #include<ctime> #include<cstd ...
 - 【UOJ83】【UR #7】水题出题人(提交答案题)
		
点此看题面 大致题意: 给你若干份排序的代码,共\(6\)个子任务,每个子任务让你构造数据使得一份代码用时在给定的\(T\)以内,另一份代码用时超过\(2000000\). 子任务\(1\):归并排序 ...
 - 【洛谷4920】[WC2015] 未来程序(提答题)
		
点此看题面 大致题意: 把\(10\)个点的暴力代码和输入数据都给你,让你求出输出数据. 子任务\(1\) 第一个子任务自然是拿来送分用的... 容易发现就是一个快速乘的过程啊. 代码如下: #inc ...
 - uoj#73 【WC2015】未来程序
		
在 2047 年,第 64 届全国青少年信息学奥林匹克冬令营前夕,B君找到了 2015 年,第 32 届冬令营的题目来练习. 他打开了第三题 “未来程序” 这道题目: 本题是一道提交答案题,一共 10 ...
 - 浅谈OI中的提交答案
		
在OI中,题目有三类: 传统题 交互题 提交答案题 今天来了解一下第三类 概述 传统题:给你一个题面,你需要交一个程序,评测姬会用你的程序运行你看不到的一些测试点,用输出和正确答案比较 提交答案题:给 ...
 - Uoj 73 未来程序
		
Uoj 73 未来程序 神仙提答. Subtask 1 仔细阅读,发现是要计算 \(a*b\ \%\ c\).用龟速乘或者 \(python\) 直接算. Subtask 2 仔细阅读并手算一下,发现 ...
 - 如何A掉未来程序改
		
话说有这样一道神题:[集训队互测2015]未来程序·改. 大意是要求写一个简单的C++解释器!这里去掉了C++的许多特性,连简单的break和continue都没有了! 话说NOI被屠了之后,一时心血 ...
 
随机推荐
- (BST 递归) leetcode98. Validate Binary Search Tree
			
Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...
 - java day02 记录
			
一.介绍运算符使用,包含+ - * / 及 自增.三元运算等 package com.itheima_02; /* * 赋值运算符: * 基本的赋值运算符:= * 扩展的赋值运算符:+=,-=,*=, ...
 - python8--文件操作 with。。。open语法
			
复习 一.类型转换 1.数字类型:int() | bool() | float() 2.str与int:int('10') | int('-10') | int('0') | float('-. ...
 - hadoop记录-如何换namenode机器
			
namenode机器磁盘IO负载持续承压,造成NAMENODE切换多次及访问异常. 1 初始化新机器1.1 在新器1.1.1.3部署hadoop软件(直接复制standby1.1.1.2节点)1.2 ...
 - 如何设置Maven代理
			
1.公司的网络走的是代理,那么如何设置maven下载jar包时也走代理呢. 根据百度出来的两篇文章 设置了一下,但是还是报错. Plugin org.apache.maven.plugins:mave ...
 - 将Python3导出为exe程序
			
一.pyinstaller简介 Python是一个脚本语言,被解释器解释执行.它的发布方式: .py文件:对于开源项目或者源码没那么重要的,直接提供源码,需要使用者自行安装Python并且安装依赖的各 ...
 - gunicorn+anaconda+nginx部署django项目(ubuntu)
			
首先进入conda 虚拟环境: source activate test 安装gunicorn: pip install gunicorn 运行gunicorn gunicorn -w 2 -b 12 ...
 - 贯穿RobotFramework框架 - 关键字(一) 最全面的疏理
			
在RF中,关键字是一个非常重要的存在.想做任何事情,都是通过关键字来实现的. 这篇文章对RobotFramework中的关键字做个整理.大概分为以下几点内容: 1.什么是关键字 2.关键字来自哪里.有 ...
 - 使用Setup factory打包WPF
			
软件环境 Win10 .NET452 WPF Setup Factory 工具直接百度下啦,关键词:Setup Factory 95 With Sn 打包过程主要参考了以下文章: https://ww ...
 - QT windeployqt
			
qt发布release版本时需要打包一些dll,需要哪些呢?请看截图: 在qt的安装包下找到这些文件,放在release文件夹下即可,当然有些时候也会需要一些其他的,比如含有串口的程序还需要加入Qt5 ...