1 条题解
-
0

#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> using namespace std; const int M = 255; #define int long long #define pii pair<int,int> #define fi first #define se second int read() { int x=0,f=1;char c; while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;} while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();} return x*f; } int n,m,ans,dp[M<<1][M];pii p[M<<1]; void add(int &x,int y) {x=(x+y)%m;} int calc(int k) { memset(dp,0,sizeof dp); dp[0][0]=1;int c1=0,c2=0; for(int i=1;i<=2*n;i++) { if(p[i].se==0)//[n,2n) { for(int j=0;j<=c2;j++) add(dp[i][j],dp[i-1][j]*(p[i].fi-c1-j+1)); c1++; } else//[0,n) { for(int j=0;j<=c2;j++) { add(dp[i][j+1],dp[i-1][j]*(p[i].fi-c1-j+1)); add(dp[i][j],dp[i-1][j]*(p[i].se-k-n-c2+j+1)); } c2++; } } return dp[2*n][k]; } signed main() { n=read();m=read(); for(int i=0;i<n;i++) { p[i+1].fi=ceil(sqrt(n*n-i*i))-1; p[i+1].se=floor(sqrt(4*n*n-i*i)); p[i+1].se=min(p[i+1].se,2*n-1); } for(int i=n;i<2*n;i++) { p[i+1].fi=floor(sqrt(4*n*n-i*i)); p[i+1].fi=min(p[i+1].fi,2*n-1); } sort(p+1,p+1+2*n); for(int i=0;i<=n;i++) { if(i&1) ans=(ans+m-calc(i))%m; else ans=(ans+calc(i))%m; } printf("%lld\n",(ans+m)%m); }
- 1
信息
- ID
- 8595
- 时间
- 4000ms
- 内存
- 1024MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者