結果
| 問題 |
No.2651 [Cherry 6th Tune B] $\mathbb{C}$omplex комбинат
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-02-23 22:45:05 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 387 ms / 2,500 ms |
| コード長 | 2,117 bytes |
| コンパイル時間 | 3,083 ms |
| コンパイル使用メモリ | 250,032 KB |
| 実行使用メモリ | 7,948 KB |
| 最終ジャッジ日時 | 2024-09-29 07:52:15 |
| 合計ジャッジ時間 | 14,647 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 39 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
constexpr const int maxa=1000000001;
constexpr const ll mod=998244353;
ll euclid(ll a,ll b,ll& x,ll& y){
if(b==0){
x=1;y=0;
return a;
}else{
ll d=euclid(b,a%b,x,y);
ll t=x;
x=y;
y=t-(a/b)*y;
return d;
}
}
ll inv(ll p){
ll x,y;
euclid(p,mod,x,y);
return (x+mod)%mod;
}
struct c{
ll x,y;
c(){x=0;y=0;}
c(ll x,ll y):x(x),y(y){}
ll abs(){
return (x*x+y*y)%mod;
}
c conj(){
return c(x,(mod-y)%mod);
}
void print(){
cout<<to_string(x)+"+("+to_string(y)+")*i"<<endl;
}
};
c operator+ (c x,c y){
return c((x.x+y.x+2*mod)%mod,(x.y+y.y+2*mod)%mod);
}
c operator* (c x,c y){
return c(((x.x+mod)%mod*(y.x+mod)%mod-(x.y+mod)%mod*(y.y+mod)%mod+mod)%mod,((x.x+mod)%mod*(y.y+mod)%mod+(x.y+mod)%mod*(y.x+mod)%mod+mod)%mod);
}
c operator/ (c x,ll y){
return c(((x.x+mod)*inv(y))%mod,((x.y+mod)*inv(y))%mod);
}
c operator% (c x,ll y){
return c((x.x+mod)%y,(x.y+mod)%y);
}
int main()
{
int t;
cin>>t;
while(t--){
int n;
cin>>n;
vector<c> z(n);
for(int i=0;i<n;i++){
ll x,y;
cin>>x>>y;
z[i]=c(x,y);
}
vector<ll> sumsr(2);
vector<c> sumsc(2);
ll ans=0;
for(int i=0;i<n;i++){
ans+=sumsr[0]*inv(z[i].abs())+sumsr[1]*z[i].abs()-(sumsc[0]*(z[i].conj()*z[i].conj()/z[i].abs())+sumsc[1]*(z[i]*z[i]/z[i].abs())).x;
//z[i].conj().print();
//(z[i].conj()*z[i].conj()).print();
//(z[i].conj()*z[i].conj()/z[i].abs()).print();
//(sumsc[0]*(z[i].conj()*z[i].conj()/z[i].abs())+sumsc[1]*(z[i]*z[i]/z[i].abs())).print();
sumsr[0]=(sumsr[0]+z[i].abs()+mod)%mod;
sumsr[1]=(sumsr[1]+inv(z[i].abs())+mod)%mod;
sumsc[0]=(sumsc[0]+z[i]*z[i]/z[i].abs())%mod;
sumsc[1]=(sumsc[1]+z[i].conj()*z[i].conj()/z[i].abs())%mod;
ans=(ans+mod)%mod;
}
cout<<ans<<endl;
}
return 0;
}