kmjp's blog

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

Codeforces #752 Div1 : B. Moderate Modular Mode

悪くはなかった回。
https://codeforces.com/contest/1603/problem/B

問題

2つの偶数である正整数X,Yが与えられる。
正整数Nのうち、N % X = Y % N となるものを求めよ。

解法

大小関係で分岐する。

  • X>Yなら、N=X+Yにしておけば、N%X=Y%N=Yとなる。
  • YがXの倍数なら、N=YならY%X=Y%Y=0となる。
  • それ以外の場合、N=(X*Floor(Y/X)+Y)/2にしておこう。
    • X<YかつYがXの倍数でないので、NはX以上Y未満である。この場合 N%X=Y%N=Y-Nとなる。
int T;
ll X,Y;

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>T;
	while(T--) {
		cin>>X>>Y;
		
		ll N;
		if(X>Y) {
			N=(X+Y);
		}
		else if(Y%X==0) {
			N=Y;
		}
		else {
			ll v=X*(Y/X);
			N=(v+Y)/2;
		}
		assert(N%X==Y%N);
		cout<<N<<endl;
	}
}

まとめ

これは本番もそこまで手間取らなかったな。