kmjp's blog

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

yukicoder : No.3168 [Cherry 7th Tune D] Manhole

これは割とすんなり解けた。
https://yukicoder.me/problems/no/3168

問題

3次元座標上で点(A,B,C)が与えられる。
原点と点(A,B,C)を結ぶ直線を中心とする半径1の円柱を考える。
この円柱とxy座標の共通部分の面積をSとしたとき、(S/π)^2を求めよ。

解法

原点と点(A,B,C)を結ぶ直線と、xy平面がなす角をθとすると、S/π=1/sinθ=√( (A^2+B^2+C^2)/(C^2))となる。

int T;
ll A,B,C;
const ll mo=998244353;

ll modpow(ll a, ll n = mo-2) {
	ll r=1;a%=mo;
	while(n) r=r*((n%2)?a:1)%mo,a=a*a%mo,n>>=1;
	return r;
}

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>T;
	while(T--) {
		cin>>A>>B>>C;
		
		ll ret=((A*A+B*B+C*C)%mo)*(modpow(C*C))%mo;
		cout<<ret<<endl;
	}
}

まとめ

ここまではすんなり行って良かったね。