期望得分:100+0+100=200
实际得分:100+5+100=205
T1
空间卡到30M。。
n<=2.5*1e7
若x是整除区间[1,n]每个数的最小的数,那么对[1,n]每个数分解质因数,
ai=2^x*3^y*5^z……
x=2^max(x) * 3^max(y) * 5^max(z) * ……
max(x)=floor (logx n)
只有5000以内的素数的指数才会>=2,所以500之后的素数打个表
代码13M,不传了
T2 bzoj 1567 Blue Mary的战役地图
正解二维哈希,但是严重不满n^7枚举可过
考试的时候zz的把return0 写成break,gg
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; inline void read (int &x) { x=0; char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); } } int a[51][51],b[51][51]; int main() { int n; read(n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) read(a[i][j]); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) read(b[i][j]); int x2a,y2a,x2b,y2b; bool ok; int ans=0; for(int len=n;len;len--) for(int xa=1;xa+len-1<=n;xa++) for(int ya=1;ya+len-1<=n;ya++) for(int xb=1;xb+len-1<=n;xb++) for(int yb=1;yb+len-1<=n;yb++) if(a[xa][ya]==b[xb][yb]) { ok=true; for(int x=1;x<=len&&ok;x++) for(int y=1;y<=len&&ok;y++) if(a[xa+x-1][ya+y-1]!=b[xb+x-1][yb+y-1]) ok=false; if(ok) { ans=len;printf("%d",ans);return 0;} } }