#include<bits/stdc++.h> #define il inline #define ll long long #define ull unsigned long long const ull O=60,H=3600,D=24*H,Y=365*D,Y1=181*D,Y2=Y-Y1,M[]={0,31*D,28*D,31*D,30*D,31*D,30*D,31*D,31*D,30*D,31*D,30*D,31*D},S1=1461*D,S2=100*S1-3*D,T1=1573*S1+731*D,T2=720*D,T3=4*S1,R[]={0,210945556800,R[1]+Y2+1,R[2]+Y+1,R[3]+Y+1,R[4]+Y+1,R[5]+Y+D+1,R[6]+Y+1,R[7]+Y+1,R[8]+Y+1,R[9]+Y+D+Y1+1,R[10]+Y+1,R[11]+Y+1,R[12]+Y+D+Y+1,R[13]+Y+Y+Y2+1,R[14]+Y+Y+D+1,R[15]+Y+1,R[16]+Y+Y1+D+1,R[17]+Y+1,R[18]+Y+1,R[19]+Y+Y2+1,R[20]+Y+D+Y1+1,R[21]+Y+Y2+1,R[22]+7*Y+D+D+1,R[23]+3*Y+D+1,212207860824,R[25]+3*Y+1,R[26]+Y+D+Y2+1},U[]={0,1972,1972,1973,1974,1975,1976,1977,1978,1979,1981,1982,1983,1985,1987,1989,1990,1992,1993,1994,1995,1997,1998,2005,2008,2012,2015,2016},V[]={0,6,12,12,12,12,12,12,12,12,6,6,6,6,12,12,12,6,6,6,12,6,12,12,12,6,6,12};
int tt,s,o,h,d,m,b; ll y; ull r,t;
il boolRun(){return y<1582?y%4==0:y%400==0||y%4==0&&y%100;}
il intGetY(){return Y+Run()*D;}
il intGetM(){if (m==2) return M[m]+Run()*D; if (m==10&&y==1582) return21*D; return M[m];}
il voidJump() { while (1) if (r>=GetY()) r-=GetY(),y++; elsebreak; while (1) if (r>=GetM()) r-=GetM(),m++; elsebreak; d+=r/D,r%=D,h+=r/H,r%=H,o+=r/O,r%=O,s=r; if (y==1582&&m==10&&d>4) d+=10; }
il voidBack() { if (t==R[b+1]){y=U[b+1],m=V[b+1],d=30+(m>6),h=23,o=59,s=60; return;} while (b--) { s--; if (s<0) s+=O,o--; if (o<0) o+=O,h--; if (h<0) h+=24,d--; if (d<1) { if (--m<1) y--,m=12,d=31; else d=GetM()/D; } } }
#include<bits/stdc++.h> #define il inline constint N=2005;
namespace IO { constint S=1<<20|500; char I[S+5],*s,*t,O[S+5],*o; int p[40],P; il charGc(){if (t==s){t=(s=I)+fread(I,1,1<<20,stdin); if (t==s) return EOF;} return *s++;} template<class T> il voidRead(T &x) { char c; while ((c=Gc())<48||c>57); x=c^48; while ((c=Gc())>47&&c<58) x=(x<<3)+(x<<1)+(c^48); } il voidFs(){if (o-O) fwrite(O,1,o-O,stdout); o=O;} il voidPc(char c){*o++=c; if (o-O==S) Fs();} structF{F(){o=O;} ~F(){Fs();}}FF; template<class T=int> il voidPrint(T x){T y; do y=x/10,p[P++]=x-y*10; while (x=y); while (P) Pc(p[--P]^48);} } using IO::Read; using IO::Print; using IO::Pc;
int n,m,k,q,ans,s[N][N],X[N],Y[N]; bool o[N];
intmain() { freopen("hideseek.in","r",stdin),freopen("hideseek.out","w",stdout); Read(n),Read(m),Read(k),Read(q); int i,j,a,b,c,d; for (i=1; i<=n; i++) for (j=1; j<=m; j++) Read(a),X[s[i][j]=a]=i,Y[a]=j; while (q--) { Read(a),Read(b),Read(c),Read(d),memset(o,0,k+1),ans=0; for (i=1; i<=k; i++) if (X[i]>=a&&X[i]<=c&&Y[i]>=b&&Y[i]<=d) ans++,o[i]=1; for (i=a; i<=c; i++) !o[s[i][b]]&&(ans++,o[s[i][b]]=1),!o[s[i][d]]&&(ans++,o[s[i][d]]=1); for (j=b; j<=d; j++) !o[s[a][j]]&&(ans++,o[s[a][j]]=1),!o[s[c][j]]&&(ans++,o[s[c][j]]=1); Print(ans),Pc('\n'); }
scanf("%d",&tt); int i; while (tt--) { for (scanf("%*d%d",&n),i=1; i<=n; i++) scanf("%*d"); for (m=0,Sol(1,n,0),printf("%d\n",m),i=1; i<=m; i++) printf("%d %d\n",A[i],B[i]); }
return0; }
T4 人文奇观 (wonders)
题面
题目描述
XieRujian 在玩 Vx Limo’s Civilization XVI。
XieRujian 再一次挑战格鲁吉亚,这次他开局就进了黄金时代,发展不断向好。现在格鲁吉亚的领土囊括了 n 个单元格,编号为 1 到 n。境内还有 m 条道路,每条道路连接了两个不同的单元格。保证任意两个单元格可以通过若干条条道路互相到达。
既然选择了修城墙加旅游业绩的城墙姐塔玛丽,XieRujian 理所当然选择走文化胜利道路。现在 XieRujian 想在境内营建若干个奇观,他草拟了 100 种建造计划,对于第 i 个单元格,恰有 pi 种计划选择在这里建造奇观。
如果有若干个建有奇观的单元格通过道路相连,便会有额外的加成。我们称一些有奇观的单元格的集合为「旅游胜地」,当且仅当对于任意属于该集合的两个单元格 U,V,从 U 出发,可以通过走若干条所连接单元格均有奇观的道路到达 V;且对于任意属于该集合的单元格 U 和不属于该集合的单元格 V,从 U 出发,没法通过走若干条所连接单元格均有奇观的道路到达 V。
游戏中还给出一个名为「奇观指数」的常数 k,玩家获得的「奇观加成」便是所有「旅游胜地」的单元格数量的 k 次方和。
由于每天都在赶 ddl,XieRujian 已经掌握了边划水边想题的技能。他现在在思考,如果把在第 i 个单元格上修建奇观的概率,设为之前草拟的 100 种计划中,有选择在此单元格建造奇观的计划的占比,即设为 pi%,那么最后获得的「奇观加成」的期望是多少。
#include<bits/stdc++.h> #define il inline #define ll long long #define pb push_back constint N=2e5+5,P=998244353;
int n,m,e,k,l,tot,ans,a[N],b[N],C[6][6],f[N][6],g[N],h[N][6][6],s[N][6],fa[N],d[N]; std::vector<int> G[N]; bool o[N];
il voidDfs(int u,int p) { f[u][0]=1; int i,j,x; for (int v:G[u]) if (v!=p&&!o[v]) { Dfs(v,u),g[u]=(g[u]+g[v]+(ll)(1-a[u]+P)*f[v][k])%P; for (i=k; i; f[u][i--]=x) for (x=j=0; j<=i; j++) x=(x+(ll)C[i][j]*f[u][j]%P*f[v][i-j])%P; } if (u!=e){for (i=k; i; f[u][i]=(ll)x*a[u]%P,i--) for (x=j=0; j<=i; j++) x=(x+(ll)C[i][j]*f[u][j])%P;} }
il voidFind(int u,int p) { d[u]=++tot,fa[u]=p; int x; for (int v:G[u]) if (!d[v]) Find(v,u); elseif (v!=p&&d[v]<d[u]){for (x=u; ; x=fa[x]) if (o[b[++l]=x]=1,x==v) break;} }
scanf("%d%d%d",&n,&m,&k); int i,j,u,x,y[6],c; for (i=1; i<=n; i++) scanf("%d",a+i),a[i]=828542813ll*a[i]%P; for (x=1; x<=m; x++) scanf("%d%d",&i,&j),G[i].pb(j),G[j].pb(i); for (C[0][0]=i=1; i<=k; i++) for (C[i][0]=j=1; j<=i; j++) C[i][j]=C[i-1][j]+C[i-1][j-1];
if (m<n) returnDfs(1,0),printf("%d\n",(f[1][k]+g[1])%P),0; for (Find(1,0),u=1; u<=l; u++) Dfs(e=b[u],0),ans=(ans+g[e])%P; for (i=0; i<=k; i++) h[0][i][i]=1; for (u=1; u<=l; u++) { for (h[u][0][0]=1,x=0; x<=k; x++) s[u][x]=(s[u-1][x]+(ll)h[u-1][k][x]*(1-a[b[u]]+P))%P; for (i=k; i; memcpy(h[u][i--],y,24)) for (memset(y,0,24),j=0; j<=i; j++) for (x=0; x<=k; x++) y[x]=(y[x]+(ll)C[i][j]*f[b[u]][j]%P*h[u-1][i-j][x])%P; for (i=k; i; memcpy(h[u][i--],y,24)) for (memset(y,0,24),j=0; j<=i; j++) for (x=0; x<=k; x++) y[x]=(y[x]+(ll)h[u][j][x]*C[i][j])%P; for (i=1; i<=k; i++) for (x=0; x<=k; x++) h[u][i][x]=(ll)h[u][i][x]*a[b[u]]%P; } for (u=0; u<=l; u++) for (x=0; x<=k; x++) s[u][x]=(s[u][x]+h[u][k][x])%P; for (memset(y,0,24),c=y[0]=1,u=l; u; u--) { for (x=i=0; i<=k; i++) x=(x+(ll)y[i]*s[u-1][i])%P; ans=(ans+(ll)c*(1-a[b[u]]+P)%P*x)%P,c=(ll)c*a[b[u]]%P; for (i=k; i; y[i--]=x) for (x=j=0; j<=i; j++) x=(x+(ll)y[i-j]*C[i][j]%P*f[b[u]][j])%P; for (i=k; i; y[i--]=x) for (x=j=0; j<=i; j++) x=(x+(ll)y[j]*C[i][j])%P; } printf("%d\n",(ans+(ll)y[k]*c)%P);