题目链接:https://codeforc.es/gym/104354/attachments

大意是构造一个n的排列,使得所有相邻的数的差的绝对值是素数

这个题是队友做的,狠狠C了一把。

大概的做法就是,小的全排列,大的找规律

当n为奇数时,从1 每次+2构造到n,然后先减3,再一直-2构造到4。最后剩下2和n-1,直接把2放到5的位置,构成2 5 7,把n-1放到n-6的位置,构造n-6 n-1 n-4

当n为偶数时,从1每次+2构造到n,然后一直-2构造到4。最后剩下2和n-1,直接把2放到5的位置,构成2 5 7,把n-1放到n-4的位置,构成n-4 n-1 n-6

code:

void solve()
{
	int n;
	cin>>n;
	
	if(n<=4){
		cout<<-1<<endl;
		return;
	}
	
	if(n<=11){
		for(int i=1;i<=n;i++){
			a[i] = i;
		}
		do{
			bool flag = true;
			for(int i=1;i<=n;i++){
				int ff = abs(a[i]-a[i%n+1]);
				if(ff==2||ff==3||ff==7||ff==5||ff==11) ;
				else{
					flag = false;
					break;
				}
			}
			if(flag){
				for(int i=1;i<=n;i++){
					cout<<a[i]<<' ';
				}
				cout<<endl;
				return;
			}
		}while(nxtper(a+1,a+n+1));
	}
	
	if(n&1){
		vector<int> ve;
		for(int i=1;i<=n;i+=2) ve.push_back(i);
		for(int i=n-3;i>=4;i-=2) ve.push_back(i);
		for(auto c:ve){
			cout<<c<<' ';
			if(c==5) cout<<2<<' ';
			if(c==n-6) cout<<n-1<<' ';
		}
		cout<<endl;
		return;
	}else{
		vector<int> ve;
		for(int i=1;i<=n-3;i+=2) ve.push_back(i);
		for(int i=n;i>=4;i-=2) ve.push_back(i);
		for(auto c:ve){
			cout<<c<<' ';
			if(c==5) cout<<2<<' ';
			if(c==n-4) cout<<n-1<<' ';
		}
		cout<<endl;
	}
}

题目链接:https://codeforc.es/contest/1838/problem/C

大意是给出n*m的矩阵,你可以填写1-n*m这些数字。你需要构造出对于任意一个位置,它与上下左右邻居的差的绝对值不为质数。

思路1:对于n为偶数,很好构造,直接1 2 3 4/5 6 7 8 类似这样。

对于n为奇数,奇偶直接错排。

类似:


1 2 3 4

13 14 15 16

5 6 7 8

17 18 19 20

9 10 11 12


code:

void solve()
{
	int n,m;
	cin>>n>>m;
	if (n > 4){
        int cnt = 0;
        for(int i = 0; i < n; i += 2){
            for(int j = 0; j < m; j++){
                a[i][j] = ++cnt;
            }
        }
        for(int i = 1; i < n; i += 2){
            for(int j = 0; j < m; j++){
                a[i][j] = ++cnt;
            }
        }
    }
    else{
        int cnt = 0;
        for(int i = 0; i < m; i += 2){
            for(int j = 0; j < n; j++){
                a[j][i] = ++cnt;
            }
        }
        for(int i = 1; i < m; i += 2){
            for(int j = 0; j < n; j++){
                a[j][i] = ++cnt;
            }
        }
    }
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            cout << a[i][j] << ' ';
        }
        cout << '\n';
    }
}