Codeforces Round #770 (Div. 2)


这场好好玩,每道题都有一个小彩蛋,放上来好了。

B. Fortune Telling

Haha, try to solve this, SelectorUnlimited! — antontrygubO_o

题意:给出两个数x、x+3、数组a和目标y。对于每一个ai,可以选择加或者异或。问x和x+3哪个能变成y。

解:既然只是问哪个能,并且有且只有一个数能变成y,那大概率是找一个关键点。异或涉及位运算,初始给的x和x+3最后一位一定不同。异或是不进位的加法,随便挑两个数手模一下也是只有最后一位,对于无论哪个操作来说答案是肯定的。那问题解决了,哪个数操作完和y最后一位一样挑哪个。

代码:

#include 
using namespace std;
#define ll long long
#define maxx 200005
#define maxn 1005
#define maxm 305
#define eps 0.00000001
#define inf 0x7fffffff
#define mod 998244353
//#define int long long
ll n,x,y;
ll a[maxx];
signed main() {
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%lld%lld%lld",&n,&x,&y);
        for(int i=1;i<=n;i++)
            scanf("%lld",&a[i]);
        ll ans=0;
        y%=2;
        for(int i=1;i<=n;i++)
            ans=(ans+a[i])%2;
        if((x+ans)%2==y)
            printf("Alice\n");
        else
            printf("Bob\n");
    }
    return 0;
}
//9 62

C. OKEA

People worry that computers will get too smart and take over the world, but the real problem is that they're too stupid and they've already taken over the world. — Pedro Domingos

题意:给出一个n*k的矩阵,将1-n*k填入矩阵中,要求对于每一行中任意一段连续的数,其平均值是一个整数。

解:肉眼可见k=1时的解。先考虑每2个数。两个数之和要是偶数,那么不可能为一奇一偶,也就是说,每行只能由奇数或偶数组成,因此当n为奇数且k不为1时无解。很自然地会想到这么分:

1 3 5 7 9 11

2 4 6 8 10 12

惊喜地发现好像确实连着的每段数都满足要求。证明的话等差数列就可以,略。

代码:

#include 
using namespace std;
#define ll long long
#define maxx 200005
#define maxn 1005
#define maxm 305
#define eps 0.00000001
#define inf 0x7fffffff
#define mod 998244353
//#define int long long
int n,k;
signed main() {
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&k);
        if(k==1){
            printf("YES\n");
            for(int i=1;i<=n;i++)
                printf("%d\n",i);
            continue;
        }
        if(n%2==1){
            printf("NO\n");
            continue;
        }
        printf("YES\n");
        for(int i=0;i2;i++){
            for(int j=1+i*k*2;j<=2*k-1+i*k*2;j+=2)
                printf("%d ",j);
            printf("\n");
            for(int j=2+i*k*2;j<=2*k+i*k*2;j+=2)
                printf("%d ",j);
            printf("\n");
        }
    }
    return 0;
}
//9 62

夕阳的余晖落在白墙上,打出水彩般澄澈的橘黄,很好看。

— 本文无聊的作者