結果
問題 |
No.187 中華風 (Hard)
|
ユーザー |
![]() |
提出日時 | 2025-03-18 19:21:16 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 118 ms / 3,000 ms |
コード長 | 1,280 bytes |
コンパイル時間 | 2,260 ms |
コンパイル使用メモリ | 207,604 KB |
実行使用メモリ | 7,324 KB |
最終ジャッジ日時 | 2025-03-18 19:21:21 |
合計ジャッジ時間 | 4,831 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 25 |
ソースコード
#include<bits/stdc++.h> using namespace std; int modinv(int a,int m){ a%=m; if((a-1)%m==0)return a; return(1-(long)m*modinv(m,a))/a; } pair<int,int>crt_mod(vector<int>r,vector<int>m,int mod){ int n=r.size(); assert(m.size()==n); unordered_map<int,pair<int,int>>qr; for(int i=0;i<n;i++){ int x=m[i]; for(int j=2;j*j<=x;j++){ if(x%j)continue; int q=1; while(x%j==0)q*=j,x/=j; int a=r[i]%q; if(!qr.count(j)){qr[j]={q,a};continue;} auto&[Q,R]=qr[j]; if(q>Q)swap(q,Q),swap(a,R); if((R-a)%q)return{0,0}; } if(x>1){ int a=r[i]%x; if(!qr.count(x))qr[x]={x,a}; else if((qr[x].second-a)%x)return{0,0}; } } m.clear(),r.clear(); for(auto[p,qr]:qr)m.push_back(qr.first),r.push_back(qr.second); n=m.size(); m.push_back(mod); vector<int>x(n+1),p(n+1,1); for(int i=0;i<n;i++){ int k=long(r[i]-x[i])%m[i]*modinv(p[i],m[i])%m[i]; if(k<0)k+=m[i]; assert(0<=k&&k<m[i]); for(int j=i+1;j<=n;j++){ x[j]=(x[j]+(long)k*p[j]%m[j])%m[j]; p[j]=(long)p[j]*m[i]%m[j]; } } return{x[n],p[n]}; } int main(){ int n; cin>>n; vector<int>r(n),m(n); for(int i=0;i<n;i++)cin>>r[i]>>m[i]; auto[x,l]=crt_mod(r,m,1000000007); if(l==0){cout<<-1<<'\n';return 0;} bool zero=1; for(int i=0;i<n;i++)if(r[i]>0)zero=0; cout<<(zero?l:x)<<'\n'; }