1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<string>
#include<iostream>
#include<map>
using namespace std;
const int MAXN=10010;
struct Tmatrix
{
int n,m,k,f,d;
int a[MAXN];
int &get(int i,int j,int k1)
{
return a[i*m*k+j*k+k1];
}
};
int n,m;
map<string,int> hash1;
Tmatrix a[100];
string b[100];
void init()
{
hash1.clear();
m=0;
}
int getNum(string &s)
{
if(hash1[s]==0)
hash1[s]=++m;
return hash1[s];
}
void readln()
{
n=0;
char c=' ';
while(c==' ')
{
cin>>b[++n];
c=getchar();
}
}
void deal(int &l,int &r)
{
int i,t;
while(1)
{
if(b[l]!="(" || b[r]!=")")
return;
t=0;
for(i=l;i<=r;++i)
if(b[i]=="(")
++t;
else if(b[i]==")")
--t;
else if(t==0)
return;
++l;
--r;
}
}
bool isNum(string &s)
{
int i,l=s.size();
for(i=0;i<l;++i)
if(s[i]<'0'||s[i]>'9')
return false;
return true;
}
int strToNum(string &s)
{
int i,l=s.size();
int t=0;
for(i=0;i<l;++i)
t=t*10+s[i]-'0';
return t;
}
bool isAllNum(int l,int r)
{
for(int i=l;i<=r;++i)
if(!isNum(b[i]))
return false;
return true;
}
Tmatrix operator + (Tmatrix m1,Tmatrix m2)
{
if(m1.f>0)
m1=a[m1.f];
if(m2.f>0)
m2=a[m2.f];
Tmatrix tmp=m1;
int i,j,k;
if(m2.n*m2.m*m2.k==1)
{
for(i=0;i<m1.n;++i)
for(j=0;j<m1.m;++j)
for(k=0;k<m1.k;++k)
tmp.get(i,j,k)+=m2.get(0,0,0);
}
else if(m1.n*m1.m*m1.k==1)
{
tmp=m2;
for(i=0;i<m2.n;++i)
for(j=0;j<m2.m;++j)
for(k=0;k<m2.k;++k)
tmp.get(i,j,k)+=m1.get(0,0,0);
}
else
{
for(i=0;i<m1.n;++i)
for(j=0;j<m1.m;++j)
for(k=0;k<m1.k;++k)
tmp.get(i,j,k)+=m2.get(i,j,k);
}
return tmp;
}
Tmatrix operator - (Tmatrix m1,Tmatrix m2)
{
if(m1.f>0)
m1=a[m1.f];
if(m2.f>0)
m2=a[m2.f];
Tmatrix tmp=m1;
int i,j,k;
if(m2.n*m2.m*m2.k==1)
{
for(i=0;i<m1.n;++i)
for(j=0;j<m1.m;++j)
for(k=0;k<m1.k;++k)
tmp.get(i,j,k)-=m2.get(0,0,0);
}
else if(m1.n*m1.m*m1.k==1)
{
tmp=m2;
for(i=0;i<m2.n;++i)
for(j=0;j<m2.m;++j)
for(k=0;k<m2.k;++k)
tmp.get(i,j,k)=m1.get(0,0,0)-tmp.get(i,j,k);
}
else
{
for(i=0;i<m1.n;++i)
for(j=0;j<m1.m;++j)
for(k=0;k<m1.k;++k)
tmp.get(i,j,k)-=m2.get(i,j,k);
}
return tmp;
}
Tmatrix operator * (Tmatrix m1,Tmatrix m2)
{
if(m1.f>0)
m1=a[m1.f];
if(m2.f>0)
m2=a[m2.f];
Tmatrix tmp=m1;
int i,j,k;
if(m2.n*m2.m*m2.k==1)
{
for(i=0;i<m1.n;++i)
for(j=0;j<m1.m;++j)
for(k=0;k<m1.k;++k)
tmp.get(i,j,k)*=m2.get(0,0,0);
}
else if(m1.n*m1.m*m1.k==1)
{
tmp=m2;
for(i=0;i<m2.n;++i)
for(j=0;j<m2.m;++j)
for(k=0;k<m2.k;++k)
tmp.get(i,j,k)*=m1.get(0,0,0);
}
else
{
for(i=0;i<m1.n;++i)
for(j=0;j<m1.m;++j)
for(k=0;k<m1.k;++k)
tmp.get(i,j,k)*=m2.get(i,j,k);
}
return tmp;
}
Tmatrix rho(Tmatrix m1,Tmatrix m2)
{
if(m1.f>0)
m1=a[m1.f];
if(m2.f>0)
m2=a[m2.f];
Tmatrix tmp;
tmp.f=0;
tmp.n=m1.get(0,0,0);
tmp.m=m1.get(1,0,0);
tmp.k=m1.get(2,0,0);
if(m1.n<3)
tmp.k=1;
if(m1.n<2)
tmp.m=1;
tmp.d=m1.n;
int i,j,k,l=0;
for(i=0;i<tmp.n;++i)
for(j=0;j<tmp.m;++j)
for(k=0;k<tmp.k;++k)
{
tmp.get(i,j,k)=m2.get(l,0,0);
l=(l+1)%m2.n;
}
return tmp;
}
Tmatrix iota(Tmatrix m1)
{
if(m1.f>0)
m1=a[m1.f];
Tmatrix tmp;
tmp.f=0;
tmp.n=m1.get(0,0,0);
tmp.m=1;
tmp.k=1;
tmp.d=1;
for(int i=0;i<tmp.n;++i)
tmp.get(i,0,0)=i+1;
return tmp;
}
Tmatrix drop(Tmatrix m1,Tmatrix m2)
{
if(m1.f>0)
m1=a[m1.f];
if(m2.f>0)
m2=a[m2.f];
Tmatrix tmp=m2;
tmp.f=0;
int i,j,k;
tmp.n-=m1.get(0,0,0);
for(i=0;i<m2.n-m1.get(0,0,0);++i)
for(j=0;j<m2.m;++j)
for(k=0;k<m2.k;++k)
tmp.get(i,j,k)=tmp.get(i+m1.get(0,0,0),j,k);
return tmp;
}
Tmatrix op1(Tmatrix m1)
{
if(m1.f>0)
m1=a[m1.f];
Tmatrix tmp=m1;
if(tmp.d>1)
--tmp.d;
int i,j,k;
if(m1.d==3)
{
tmp.k=1;
for(i=0;i<m1.n;++i)
for(j=0;j<m1.m;++j)
{
tmp.get(i,j,0)=m1.get(i,j,m1.k-1);
for(k=m1.k-2;k>=0;--k)
tmp.get(i,j,0)=m1.get(i,j,k)+tmp.get(i,j,0);
}
}
else if(m1.d==2)
{
tmp.m=1;
for(i=0;i<m1.n;++i)
{
tmp.get(i,0,0)=m1.get(i,m1.m-1,0);
for(k=m1.m-2;k>=0;--k)
tmp.get(i,0,0)=m1.get(i,k,0)+tmp.get(i,0,0);
}
}
else
{
tmp.n=1;
{
tmp.get(0,0,0)=m1.get(m1.n-1,0,0);
for(k=m1.n-2;k>=0;--k)
tmp.get(0,0,0)=m1.get(k,0,0)+tmp.get(0,0,0);
}
}
return tmp;
}
Tmatrix op2(Tmatrix m1)
{
if(m1.f>0)
m1=a[m1.f];
Tmatrix tmp=m1;
if(tmp.d>1)
--tmp.d;
int i,j,k;
if(m1.d==3)
{
tmp.k=1;
for(i=0;i<m1.n;++i)
for(j=0;j<m1.m;++j)
{
tmp.get(i,j,0)=m1.get(i,j,m1.k-1);
for(k=m1.k-2;k>=0;--k)
tmp.get(i,j,0)=m1.get(i,j,k)-tmp.get(i,j,0);
}
}
else if(m1.d==2)
{
tmp.m=1;
for(i=0;i<m1.n;++i)
{
tmp.get(i,0,0)=m1.get(i,m1.m-1,0);
for(k=m1.m-2;k>=0;--k)
tmp.get(i,0,0)=m1.get(i,k,0)-tmp.get(i,0,0);
}
}
else
{
tmp.n=1;
{
tmp.get(0,0,0)=m1.get(m1.n-1,0,0);
for(k=m1.n-2;k>=0;--k)
tmp.get(0,0,0)=m1.get(k,0,0)-tmp.get(0,0,0);
}
}
return tmp;
}
Tmatrix op3(Tmatrix m1)
{
if(m1.f>0)
m1=a[m1.f];
Tmatrix tmp=m1;
if(tmp.d>1)
--tmp.d;
int i,j,k;
if(m1.d==3)
{
tmp.k=1;
for(i=0;i<m1.n;++i)
for(j=0;j<m1.m;++j)
{
tmp.get(i,j,0)=m1.get(i,j,m1.k-1);
for(k=m1.k-2;k>=0;--k)
tmp.get(i,j,0)=m1.get(i,j,k)*tmp.get(i,j,0);
}
}
else if(m1.d==2)
{
tmp.m=1;
for(i=0;i<m1.n;++i)
{
tmp.get(i,0,0)=m1.get(i,m1.m-1,0);
for(k=m1.m-2;k>=0;--k)
tmp.get(i,0,0)=m1.get(i,k,0)*tmp.get(i,0,0);
}
}
else
{
tmp.n=1;
{
tmp.get(0,0,0)=m1.get(m1.n-1,0,0);
for(k=m1.n-2;k>=0;--k)
tmp.get(0,0,0)=m1.get(k,0,0)*tmp.get(0,0,0);
}
}
return tmp;
}
Tmatrix calc(int l,int r)
{
deal(l,r);
int i,j,t=0;
Tmatrix tmp;
if(isAllNum(l,r))
{
tmp.n=tmp.f=0;
tmp.m=tmp.k=tmp.d=1;
for(i=l;i<=r;i++)
tmp.get(tmp.n++,0,0)=strToNum(b[i]);
return tmp;
}
if(l==r)
{
tmp.f=getNum(b[l]);
return tmp;
}
j=-1;
for(i=l;i<=r;++i)
if(b[i]==")")
++t;
else if(b[i]=="(")
--t;
else if(t==0&&(i>l)&&
(b[i]=="+" || b[i]=="-"
||b[i]=="*"||b[i]=="="
||b[i]=="iota"||b[i]=="drop"
||b[i]=="rho"))
{
j=i;
break;
}
Tmatrix m1,m2;
if(b[l]=="iota")
{
m1=calc(l+1,r);
return iota(m1);
}
if(b[l+1]=="/")
{
m1=calc(l+2,r);
if(b[l]=="+")
return op1(m1);
if(b[l]=="-")
return op2(m1);
if(b[l]=="*")
return op3(m1);
}
if(b[j]=="+")
{
m2=calc(j+1,r);
if(m2.f>0)
m2=a[m2.f];
m1=calc(l,j-1);
return m1+m2;
}
if(b[j]=="-")
{
m2=calc(j+1,r);
if(m2.f>0)
m2=a[m2.f];
m1=calc(l,j-1);
return m1-m2;
}
if(b[j]=="*")
{
m2=calc(j+1,r);
if(m2.f>0)
m2=a[m2.f];
m1=calc(l,j-1);
return m1*m2;
}
if(b[j]=="=")
{
m2=calc(j+1,r);
m1=calc(l,j-1);
a[m1.f]=m2;
return m2;
}
if(b[j]=="rho")
{
m2=calc(j+1,r);
if(m2.f>0)
m2=a[m2.f];
m1=calc(l,j-1);
return rho(m1,m2);
}
if(b[j]=="drop")
{
m2=calc(j+1,r);
if(m2.f>0)
m2=a[m2.f];
m1=calc(l,j-1);
return drop(m1,m2);
}
}
void solve()
{
int CASE=0;
readln();
int i,j,k;
Tmatrix tmp;
while(b[1]!="#")
{
cout<<"Case "<<(++CASE)<<":";
for(i=1;i<=n;++i)
cout<<" "<<b[i];
cout<<endl;
tmp=calc(1,n);
if(tmp.f>0)
tmp=a[tmp.f];
if(tmp.d==3)
{
for(j=0;j<tmp.m;++j)
{
for(k=0;k<tmp.k;++k)
cout<<" "<<tmp.get(0,j,k);
cout<<endl;
}
for(i=1;i<tmp.n;++i)
{
cout<<endl;
for(j=0;j<tmp.m;++j)
{
for(k=0;k<tmp.k;++k)
cout<<" "<<tmp.get(i,j,k);
cout<<endl;
}
}
}
else if(tmp.d==2)
{
for(j=0;j<tmp.n;++j)
{
for(k=0;k<tmp.m;++k)
cout<<" "<<tmp.get(j,k,0);
cout<<endl;
}
}
else
{
for(k=0;k<tmp.n;++k)
cout<<" "<<tmp.get(k,0,0);
cout<<endl;
}
//fupdate(stdout);
readln();
}
}
int main()
{
init();
solve();
return 0;
}
2
#include<stdio.h>
#include<string.h>
#include<stdio.h>
const int MAXN=210;
const int MAXM=310;
int n,m;
double w;
int a[MAXN];
int b[MAXN];
int c[MAXN];
double abs(double x)
{
return x<0?-x:x;
}
void init()
{
for(int i=1;i<=n;++i)
scanf("%d",a+i);
}
bool CheckWide(double w)
{
for(int i=1;i<=n;++i)
if(abs(a[i]-w)*20<=w+1e-6)
b[i]=0;
else if(abs(a[i]-w*2)*10<=w+1e-6)
b[i]=1;
else
return false;
return true;
}
bool check()
{
int i;
for(i=6;i<=n;i+=6)
if(b[i]!=0)
return false;
for(i=1;i<=n;i+=6)
{
if(b[i]==0&&b[i+1]==0&&b[i+2]==0&&b[i+3]==0&&b[i+4]==1)
c[i/6+1]=0;
else if(b[i]==1&&b[i+1]==0&&b[i+2]==0&&b[i+3]==0&&b[i+4]==1)
c[i/6+1]=1;
else if(b[i]==0&&b[i+1]==1&&b[i+2]==0&&b[i+3]==0&&b[i+4]==1)
c[i/6+1]=2;
else if(b[i]==1&&b[i+1]==1&&b[i+2]==0&&b[i+3]==0&&b[i+4]==0)
c[i/6+1]=3;
else if(b[i]==0&&b[i+1]==0&&b[i+2]==1&&b[i+3]==0&&b[i+4]==1)
c[i/6+1]=4;
else if(b[i]==1&&b[i+1]==0&&b[i+2]==1&&b[i+3]==0&&b[i+4]==0)
c[i/6+1]=5;
else if(b[i]==0&&b[i+1]==1&&b[i+2]==1&&b[i+3]==0&&b[i+4]==0)
c[i/6+1]=6;
else if(b[i]==0&&b[i+1]==0&&b[i+2]==0&&b[i+3]==1&&b[i+4]==1)
c[i/6+1]=7;
else if(b[i]==1&&b[i+1]==0&&b[i+2]==0&&b[i+3]==1&&b[i+4]==0)
c[i/6+1]=8;
else if(b[i]==1&&b[i+1]==0&&b[i+2]==0&&b[i+3]==0&&b[i+4]==0)
c[i/6+1]=9;
else if(b[i]==0&&b[i+1]==0&&b[i+2]==1&&b[i+3]==0&&b[i+4]==0)
c[i/6+1]=10;
else if(b[i]==0&&b[i+1]==0&&b[i+2]==1&&b[i+3]==1&&b[i+4]==0)
c[i/6+1]=11;
else
return false;
}
if(c[1]!=11||c[m]!=11)
return false;
int C=0,K=0;
int nn=m-4;
for(i=1;i<=nn;++i)
C=(C+((nn-i)%10+1)*c[i+1])%11;
if(C!=c[m-2])
{
printf("bad C\n");
return true;
}
for(i=1;i<=nn+1;++i)
K=(K+((nn-i+1)%9+1)*c[i+1])%11;
if(K!=c[m-1])
{
printf("bad K\n");
return true;
}
for(i=2;i<=nn+1;++i)
{
if(c[i]<10)
printf("%d",c[i]);
else
printf("-");
}
printf("\n");
return true;
}
void solve()
{
int i,j;
if(n%6!=5)
{
printf("bad code\n");
return;
}
m=n/6+1;
if(m<4)
{
printf("bad cold\n");
return;
}
j=1;
for(i=1;i<=n;++i)
{
w=a[i];
if(CheckWide(w))
{
j=0;
break;
}
w=a[i]/0.95;
if(CheckWide(w))
{
j=0;
break;
}
w=a[i]/1.05;
if(CheckWide(w))
{
j=0;
break;
}
}
if(j)
{
printf("bad code\n");
return;
}
if(check())
return;
for(i=1;i*2<=n;++i)
{
j=b[i];
b[i]=b[n+1-i];
b[n+1-i]=j;
}
if(!check())
{
printf("bad code\n");
}
}
int main()
{
int CASE=0;
while((scanf("%d",&n)!=EOF)&&n)
{
init();
printf("Case %d: ",++CASE);
solve();
}
return 0;
}
3
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
const int MAXN=2010;
struct Twall
{
int x1,x2,y;
};
int n,m,w,n1,m1;
Twall a[MAXN];
int lx[MAXN*2];
long long ans;
bool f[MAXN];
bool g[MAXN];
void init()
{
int i;
ans=(long long) n*m;
n1=0;
for(i=1;i<=w;++i)
{
scanf("%ld %ld %ld %ld",&a[i].x1,&a[i].y,&a[i].x2,&a[i].y);
++a[i].x2;
ans-=a[i].x2-a[i].x1;
lx[++n1]=a[i].x1;
lx[++n1]=a[i].x2;
}
lx[++n1]=0;
lx[++n1]=n;
}
void discrete(int a[],int &len)
{
sort(a+1,a+1+len);
int i,j=1;
for(i=2;i<=len;++i)
if(a[j]!=a[i])
a[++j]=a[i];
len=j;
}
int bin(int a[],int len,int k)
{
int l=1;
int r=len;
int m;
while(l<r)
{
m=(l+r)>>1;
if(a[m]==k)
return m;
else if(a[m]>k)
r=m-1;
else
l=m+1;
}
return -1;
}
bool cmp_Twall(Twall a,Twall b)
{
if(a.y==b.y)
return a.x2>b.x2;
else
a.y>b.y;
}
void deal_f(int k)
{
int i;
long long t=0;
for(i=1;i<n1;++i)
if(f[i])
t+=lx[i+1]-lx[i];
ans-=(long long )t*k;
}
void solve()
{
discrete(lx,n1);
int i,j;
for(i=1;i<=w;++i)
{
a[i].x1=bin(lx,n1,a[i].x1);
a[i].x2=bin(lx,n1,a[i].x2);
}
sort(a+1,a+w+1,cmp_Twall);
int last=m;
memset(f,0,sizeof(f));
f[n1-1]=true;
int st=1,ed;
while(st<=w)
{
ed=st;
while((ed<w)&&(a[ed+1].y==a[ed].y))
++ed;
if(a[st].y!=last-1)
{
for(i=n1-2;i>=1;--i)
f[i]=f[i]||f[i+1];
deal_f(last-a[st].y-1);
}
memset(g,true,sizeof(g));
for(i=st;i<=ed;++i)
for(j=a[i].x1;j<a[i].x2;++j)
g[j]=false;
f[n1-1]=f[n1-1]&&g[n1-1];
for(i=n1-2;i>=1;--i)
f[i]=g[i]&&(f[i]||f[i+1]);
deal_f(1);
last=a[st].y;
st=ed+1;
}
for(i=n1-2;i>=1;--i)
f[i]=f[i]||f[i+1];
deal_f(last);
printf("%lld\n",ans);
}
int main()
{
int CASE=0;
while((scanf("%ld %ld %ld",&m,&n,&w)!=EOF)&&(n||m))
{
init();
printf("Case %ld: ",++CASE);
solve();
}
return 0;
}