結果
問題 | No.2651 [Cherry 6th Tune B] $\mathbb{C}$omplex комбинат |
ユーザー | askr58 |
提出日時 | 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; }