AtCoder Grand Contest 061(题解)

A - Long Shuffle

这道题本质是一个找规律的题

既然是打表题,我们先暴力把他打出来

AtCoder Grand Contest 061(题解)_第1张图片

(盗一张图.jpg) 

AtCoder Grand Contest 061(题解)_第2张图片

接下来就是在这张图中挖掘答案

我们可以明显的看到偶数行是有一些规律的

要么是相邻对的互换,要么不变

不变和互换的位置也有讲究,在二进制下可以发现这样的规律

AtCoder Grand Contest 061(题解)_第3张图片

这里的n和k代表第n行的第k个数

我们发现偶数行完全满足这个公式

而对于奇数行,看起来没什么规律

我们可以联系n-1行,也就是奇数行对应的上一个偶数行

可以发现对于奇数行A(i,j),满足A(i,j)=A(i-1,A(i-1,j-1)+1) 当j大于1且小于n

代码如下:

#include 
#define int long long
#define pb push_back
#define fer(i,a,b) for(int i=a;i<=b;++i)
#define der(i,a,b) for(int i=a;i>=b;--i)
#define all(x) (x).begin(),(x).end()
#define pll pair
#define et  cout<<'\n'
#define xx first
#define yy second
using namespace std; 
int A[105];
void go(int l, int r) {
    if (l + 1 == r) {
        swap(A[l], A[r]);
    }
    else {
        go(l, r - 1);
        go(l + 1, r);
    }
}//暴力
int back(int n, int k) {
    k--;
    int block = k / 2;
    int F = n / 2 - 1;
    if ((F & block) == block) {
        k ^= 1;
    }
    return k + 1;
}
signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int tst;
    cin >> tst;
    while (tst--) {
        int n, k;
        cin >> n >> k;
        if (n % 2 == 1) {
            if (k > 1) {
                k = back(n - 1, k - 1);
                k++;
            }
            if (k <= n - 1) {
                k = back(n - 1, k);
            }
            cout << k << '\n';
        }
        else {
            int f1 = back(n, k);
            cout << f1 << '\n';
        }
    }
    return 0;
}

B - Summation By Construction

这道题就很玄学

除了2是NO,其他都是YES

其中一种解决方式是

我们可以用对角线的思路来构建

比如

AtCoder Grand Contest 061(题解)_第4张图片

 代码如下

#include 
#define int long long
#define pb push_back
#define fer(i,a,b) for(int i=a;i<=b;++i)
#define der(i,a,b) for(int i=a;i>=b;--i)
#define all(x) (x).begin(),(x).end()
#define pll pair
#define et  cout<<'\n'
#define xx first
#define yy second
using namespace std; 
constexpr int max_n=100;
int a[max_n+1][max_n+2];
void test(){
	int n;
	cin>>n;
	if(n==2){
		puts("No");
		return;
	}
	puts("Yes");
	if((n&1)){
		int m=n+1;
		for(int i=1; i<=n; i+=2){
			int now=i;
			for(int j=1; j<=n; ++j){
				int col=j<=i?i:(n-i);
				a[j][now]=col;
				++now>m&&(now=1);
				a[j][now]=col;
			}
		}
		for(int i=1; i<=n; ++i){
			for(int j=1; j<=n; ++j)
                cout<n&&(now=1);
			a[now][j]=col;
		}
	}
	for(int i=1; i<=n; ++i){
		for(int j=1; j<=n; ++j)
            cout<>t;
    while(t--){
        test();
    }
	return 0;
}

你可能感兴趣的:(算法)