AGC025D Choosing Points

Link
两个限制分开考虑都是二分图独立集,那么现在相当于给了一个四染色的图需要求一个不小于\(\frac{|V|}4\)的独立集,由鸽巢原理可知取最大的一种颜色的点集一定满足条件。
直接做的话是\(O(n^2c)\)的,\(c\)\(x^2+y^2=d\)的非负整数解数。
考虑如何在不建图的情况下完成二分图染色,设\(d=2^{2k}p(4\nmid p)\)
那么所有距离为\(d\)的点对都可以写成\((2^ku,2^kv)\)的形式,其中\(u^2+v^2=p^2\)
考虑\(\bmod 2^k\)的等价类,当\(p\equiv3\pmod4\)时显然不存在合法点对。
\(p\equiv1\pmod4\),那么\(u,v\)为一奇一偶,按\(u+v\)的奇偶性染色即可。
\(p\equiv2\pmod4\),那么\(u,v\)都是奇数,按\(u\)的奇偶性染色即可。

#include<cstdio>
int check(int x,int y,int d){int c=__builtin_ctz(d);return c&1? !(x>>(c/2)&1):!((x^y)>>(c/2)&1);}
int main()
{
    int n,d1,d2;scanf("%d%d%d",&n,&d1,&d2);
    for(int c=0,i=0;i<n+n;++i)
	for(int j=0;j<n+n;++j)
	    if(check(i,j,d1)&&check(i,j,d2))
	    {
		printf("%d %d\n",i,j);
		if(++c==n*n) return 0;
	    }
}
posted @ 2020-05-16 17:23  Shiina_Mashiro  阅读(235)  评论(1编辑  收藏  举报