kmjp's blog

競技プログラミング参加記です

Codeforces #884 : D. Row Major

これはすんなり。
https://codeforces.com/contest/1844/problem/D

問題

整数Nが与えられる。
以下を満たす文字列Sを構成せよ。

  • SはN文字のアルファベット小文字からなる
  • SをR行C列(N=R*C)に折りたたんで表示したとき、上下左右に隣接する文字は一致してはならない。

解法

Nの約数をdとすると、Sをd文字のループで構築すると条件に反する。
そこで、Nの約数でない整数eを探し、Sをe種類の文字のループで構成しよう。

int T,N;

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>T;
	while(T--) {
		cin>>N;
		if(N==1) {
			cout<<"a"<<endl;
			continue;
		}
		set<int> NG;
		for(x=2;x<N;x++) if(N%x==0) {
			NG.insert(N/x);
			NG.insert(x);
		}
		for(x=2;x<=100;x++) if(NG.count(x)==0) {
			FOR(i,N) cout<<(char)('a'+(i%x));
			cout<<endl;
			break;
		}
		
	}
}

まとめ

Div1+2混合とはいえ、1500ptの割に簡単な気がする。