提交时间:2026-06-03 16:06:08

运行 ID: 41860

#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define pb push_back #define eb emplace_back using namespace std; typedef long long ll; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } const int maxn=2e5+10; int n,m,p,f[1<<16],g[1<<16]; inline int add(int a,int b){if((a+=b)>=p)a-=p;return a;} void slv(){ n=read(),m=read(),p=read(); vector<pi>ve; up(i,-(n+m)+1,n+m-1){ up(j,0,n+m) if(i*i+j*j>=n*n&&i*i+j*j<(n+m)*(n+m)) ve.eb(i,j); } auto sign=[&](int x){ if(x<0)return -1; if(x>0)return 1; return 0; }; sort(ve.begin(),ve.end(),[&](pi a,pi b){ if(sign(a.p1)!=sign(b.p1))return a.p1<b.p1; if(!a.p1)return a.p2>b.p2; if(a.p1*b.p2==a.p2*b.p1)return a<b; return a.p1*b.p2<a.p2*b.p1; }); f[0]=1; vector<int>to(ve.size(),0); vector<vector<int> >G(ve.size(),vector<int>{}); vector<int>pos(ve.size(),0); up(i,0,(int)ve.size()-1){ int mx=-1; up(j,i+1,(int)ve.size()-1) if(abs(ve[i].p1-ve[j].p1)+abs(ve[i].p2-ve[j].p2)==1) G[mx=j].eb(i); to[i]=mx; } vector<int>ord; up(i,0,(int)ve.size()-1){ auto [x,y]=ve[i]; int sz=ord.size(); up(j,0,sz-1)pos[ord[j]]=j; int nw=ord.size()+(to[i]!=-1); for(int x:G[i])if(to[x]==i)nw--; up(j,0,(1<<nw)-1)g[j]=0; up(j,0,(1<<sz)-1){ int s=j,t=0,e=f[j]; for(int k:G[i]){ int p=pos[k]-t; if((s>>p)&1)e=add(e,e); if(to[k]==i)s=(s&((1<<p)-1))|((s>>p+1)<<p),t++; } if(~to[i]){ g[s]=add(g[s],f[j]); g[s|(1<<sz-t)]=add(g[s|(1<<sz-t)],e); }else g[s]=add(g[s],add(f[j],e)); } for(int k:G[i])if(to[k]==i)ord.erase(find(ord.begin(),ord.end(),k)); if(~to[i])ord.eb(i); up(j,0,(1<<nw)-1)f[j]=g[j]; } int res=0; up(i,0,(1<<ord.size())-1)res=add(res,f[i]); cout<<res; } int main(){ // freopen("diwuti.in","r",stdin),freopen("diwuti.out","w",stdout); slv(); return 0; }