Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
41859 baka24 【BJ】T2 C++ 解答错误 0 100 MS 2628 KB 2561 2026-06-03 15:49:18

Tests(0/5):


#include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define fr first #define sc second #define mk make_pair #define popcnt __builtin_popcount int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;} const int MAXN=1010,N=20,M=500;int Mod; void add(int &x,int y){x+=y;if(x>=Mod)x-=Mod;} int n,m,k,f[(1<<N)+10],g[(1<<N)+10],d[MAXN][MAXN],mx[4]={1,-1,0,0},my[4]={0,0,1,-1}; bool ck[MAXN][MAXN],vs[MAXN][MAXN]; pii a[MAXN*MAXN]; bool cmp(pii x,pii y){ if(x.fr*y.fr<0)return x.fr<y.fr; if(x.fr*y.fr==0)return x.fr==y.fr?x.sc<y.sc:x.fr<y.fr; return x.fr*y.sc==y.fr*x.sc?(x.sc==y.sc?x.fr<y.fr:x.sc<y.sc):x.sc*y.fr>y.sc*x.fr; } pii p[MAXN]; bool sd(pii x,pii y){return abs(x.fr-y.fr)+abs(x.sc-y.sc)==1;} void slv(){ n=read(),m=read(),Mod=read(); f[0]=1; for(int x=-n-m;x<=n+m;x++)for(int y=0;y<=n+m;y++)if(x*x+y*y>=n*n&&x*x+y*y<(n+m)*(n+m))a[++k]=mk(x,y),ck[x+M][y]=1; sort(a+1,a+k+1,cmp); for(int x=-n-m;x<=n+m;x++)for(int y=0;y<n+m;y++)if(x*x+y*y>=n*n&&x*x+y*y<(n+m)*(n+m)){ vs[x+M][y]=0; for(int o=0;o<4;o++){ int nx=x+mx[o],ny=y+my[o]; if(ny>=0&&ck[nx+M][ny])d[nx+M][ny]++; } } if(m<=10)m+=2; for(int e=1;e<=k;e++){ int x=a[e].fr,y=a[e].sc; vs[x+M][y]=1; for(int o=0;o<4;o++){ int nx=x+mx[o],ny=y+my[o]; if(vs[nx+M][ny])d[nx+M][ny]--,d[x+M][y]--; } int id=m+1,cd=0,now=0; for(int i=0;i<m;i++)if((p[i].fr||p[i].sc)&&sd(p[i],a[e]))cd|=1<<i; for(int i=0;i<m;i++)if(!d[p[i].fr+M][p[i].sc])p[i]={0,0}; for(int i=0;i<m;i++)if(p[i].fr||p[i].sc)now|=1<<i; if(d[x+M][y]){ for(int i=0;i<m;i++)if(!p[i].fr&&!p[i].sc){ p[i]=a[e],id=i; break; } } for(int s=0;s<1<<m;s++)if(f[s]){ int tmp=1<<popcnt(cd&s); if(d[x+M][y]){ add(g[s&now],f[s]); add(g[s&now|(1<<id)],f[s]*tmp%Mod); } else add(g[s&now],f[s]*(tmp+1)%Mod); } for(int i=0;i<1<<m;i++)f[i]=g[i],g[i]=0; } int ans=0; for(int i=0;i<1<<m;i++)add(ans,f[i]); // printf("%lld",ans); } signed main(){ // freopen("diwuti.in","r",stdin);freopen("diwuti.out","w",stdout); slv(); // cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s\n"; return 0; }


测评信息: