AtCoder Grand Contest 025D-Choosing Points

Created with Raphaël 2.1.2 Atcoder Atcoder Jack Jack Can you do this difficult problem? Jack thinks about it No? How can I solve this problem? Just use your brain! 。。

(〃’▽’〃)

题解:
这种题看起来很简单,题解一看谁都会做,主要是考一种思考的过程,希望有帮助吧。
我们认为 (0,0) ( 0 , 0 ) 一定可取,然后按照 2 2 d来标记整张图。
先假设 d2=a2+b2(a,bR) d 2 = a 2 + b 2 ( a , b ⊆ R ) ,这样只会多标记而不会漏掉。
Case: C a s e :
d d mod 2=1 2 = 1 a a b一定一奇一偶,按国际象棋标记即可。
定左上角为 (0,0) ( 0 , 0 )
0101010101101010101001010101011010101010010101010110101010100101010101101010101001010101011010101010 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0

d d mod 4=2 4 = 2 a a b一定都是奇数,隔一行标记一行即可。
0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1

d d mod 4=0 4 = 0 ,此时 x2=y2+z2(x=d4,y=a2,z=b2) x 2 = y 2 + z 2 ( x = d 4 , y = a 2 , z = b 2 ) 。把 d,a,b d , a , b 分别变成 x,y,z x , y , z (相当于把 2×2 2 × 2 的区域看成一个格子),再进行上述操作即可。
0011001100001100110011001100111100110011001100110000110011001100110011110011001100110011000011001100 0 0 1 1 0 0 1 1 0 0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 0 1 1 0 0 1 1 0 0

以下是 d=16 d = 16 的情况。
0000111100000011110000001111000000111100111100001111110000111111000011111100001100001111000000111100 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0

两个 d d 分别处理以下,标记叠加后为0的就是可以放的,易证明空余位置一定是多于 n2 n 2 的。任意取 n2 n 2 个即可。
Code C o d e :

#include<bits/stdc++.h>
#define N 605
using namespace std;
int f[N][N],n;
void work(int d)
{
    int t=0;
    while(d%4==0)
    {
        t++;
        d/=4;
    }
    if(d%2==1)
    {
        for(int i=0;i<2*n;i++)
            for(int j=0;j<2*n;j++)
                if(((i>>t)+(j>>t))%2==1)f[i][j]=1;
    }
    if(d%4==2)
    {
        for(int i=0;i<2*n;i++)
            for(int j=0;j<2*n;j++)
                if((i>>t)%2==1)f[i][j]=1;
    }
}
int main()
{
    int d1,d2;
    scanf("%d%d%d",&n,&d1,&d2);
    memset(f,0,sizeof(f));
    work(d1);work(d2);
    int sum=0;
    for(int i=0;i<2*n;i++)
        for(int j=0;j<2*n;j++)
            if(!f[i][j])
            {
                printf("%d %d\n",i,j);
                sum++;
                if(sum==n*n)return 0;
            }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JackflyDC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值