kmjp's blog

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

yukicoder : No.690 E869120 and Constructing Array 4

これは即答でした。
https://yukicoder.me/problems/no/689

問題

正整数Kが与えられる。
頂点1~NのN頂点からなる有向グラフを考える。
辺は頂点番号の小さい方から大きい方にのみ張ることができるとする。
頂点1→Nに至る経路がK通りとなるようなグラフを構築せよ。

解法

似たようなのCFで見たなと思ってたら、GCJだった。
Google Code Jam 2016 Round1C : B. Slides! - kmjp's blog

int K;
int N,M;
int A[32];
vector<pair<int,int>> V;
void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>K;
	A[1]=1;
	for(i=2;i<=31;i++) {
		A[i]=1<<(i-2);
		for(j=1;j<i;j++) V.push_back({j,i});
	}
	for(i=31;i>=2;i--) {
		if(K>=A[i]) {
			V.push_back({i,32});
			K-=A[i];
		}
	}
	cout<<32<<" "<<V.size()<<endl;
	FORR(v,V) cout<<v.first<<" "<<v.second<<endl;
	
}

まとめ

CFのはもう少し違うパターンだったかな。