Super Rooks on Chessboard
题意:
超级车可以攻击行、列、主对角线3 个方向。
R * C 的棋盘上有N 个超级车,问不被攻击的格子总数。行列好好做啊,就是不被攻击的行数*列数
减去主对角线的,就是不被攻击的行列中求\(r - c = d\)的三元组个数
考虑写出行和列生成函数 \(A(x)=\sum x^{r_i},B(x)=\sum x^{-c_i}\),乘起来就行了
可以乘上\(x^c\)来避免负指数
#include#include #include #include #include using namespace std;typedef long long ll;const int N = (1<<17) + 5;const double PI = acos(-1.0);inline int read() { char c=getchar(); int x=0,f=1; while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();} return x*f;}struct meow{ double x, y; meow(double a=0, double b=0):x(a), y(b){}};meow operator +(meow a, meow b) {return meow(a.x+b.x, a.y+b.y);}meow operator -(meow a, meow b) {return meow(a.x-b.x, a.y-b.y);}meow operator *(meow a, meow b) {return meow(a.x*b.x-a.y*b.y, a.x*b.y+a.y*b.x);}meow conj(meow a) {return meow(a.x, -a.y);}typedef meow cd;namespace fft { int n, rev[N]; cd omega[N], omegaInv[N]; void init(int lim) { n = 1; int k = 0; while(n < lim) n <<= 1, k++; for(int i=0; i >1]>>1) | ((i&1)<<(k-1)); for(int i=0; i >1; for(cd *p = a; p != a+n; p += l) for(int k=0; k