【Atcoder】 [ARC140E] Not Equal Rectangle

题目链接

Atcoder方向
Luogu方向

题目解法

因为 25 ∗ 25 = 625 25*25=625 2525=625,大概是 n , m n,m n,m 的范围,所以考虑把矩阵分成 B ∗ B B*B BB B ∗ B B*B BB 的小矩阵做
这里 B B B 可以取到 23,暂时考虑 m o d    23 \mod23 mod23 意义下的答案,最后 +1 即可
考虑矩阵内的构造方法: a i , j = ( i + j ) % 23 a_{i,j}=(i+j)\%23 ai,j=(i+j)%23,显然矩阵内一定合法
考虑把初始矩阵进行一定的位移得到其他的矩阵,令块 ( i , j ) (i,j) (i,j) 的位移量为 D i , j D_{i,j} Di,j
若不可行,那么一定要满足: D x 1 , y 1 = D x 2 , y 1 D_{x1,y1}=D_{x2,y1} Dx1,y1=Dx2,y1 D x 1 , y 2 = D x 2 , y 2 D_{x1,y2}=D_{x2,y2} Dx1,y2=Dx2,y2,因为同一行是无关的,反正每个块中 0 − 22 0-22 022 都出现了一次
考虑构造方案 D x , y = x ∗ ( y − 1 ) % 23 D_{x,y}=x*(y-1)\%23 Dx,y=x(y1)%23
那么 x 1 ∗ ( y 1 − 1 ) ≡ x 2 ∗ ( y 1 − 1 ) ( m o d    23 ) x1*(y1-1)\equiv x2*(y1-1)(mod\;23) x1(y11)x2(y11)(mod23)
所以 x 1 − x 2 ≡ 0 ( m o d    23 ) x1-x2\equiv 0(mod\;23) x1x20(mod23)
因为 0 ≤ x 1 < 23 ,    0 ≤ x 2 < 23 ,    x 1 ≠ x 2 0\le x1<23,\;0\le x2<23,\;x1\neq x2 0x1<23,0x2<23,x1=x2,所以构造方案可行
最后只要截出来 n ∗ m n*m nm 的矩阵就可以了

#include 
using namespace std;
const int N(600);
int a[N][N];
inline int read(){
	int FF=0,RR=1;
	char ch=getchar();
	for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
	for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
	return FF*RR;
}
int main(){
	for(int i=1;i<=23;i++) for(int j=1;j<=23;j++){
		int Delta=i*(j-1)%23;
		for(int k=0;k<23;k++) for(int l=0;l<23;l++) a[(i-1)*23+k][(j-1)*23+l]=(k+l+Delta)%23;
	}
	int n=read(),m=read();
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++) printf("%d ",a[i][j]+1);
		puts("");
	}
	return 0;
}

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