結果
問題 | No.1175 Simultaneous Equations |
ユーザー |
![]() |
提出日時 | 2021-05-11 14:35:12 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 2 ms / 2,000 ms |
コード長 | 5,399 bytes |
コンパイル時間 | 6,493 ms |
コンパイル使用メモリ | 363,048 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-09-21 19:51:09 |
合計ジャッジ時間 | 7,272 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 11 |
ソースコード
#include <bits/stdc++.h>using namespace std;#include <boost/multiprecision/cpp_int.hpp>namespace mp=boost::multiprecision;template<typename type>class field{public:function<type(type,type)> add=[](double A,double B){return (A+B);};function<type(type,type)> product=[](double A,double B){return (A*B);};function<bool(type)> in=[this](type a){int comp;return true;};//引数が体の要素か否かfunction<type(type)> add_inverse=[this](type a){return -a;};function<type(type)> product_inverse=[this](type a){return 1.0/a;};double one=1.0,zero=0;field(string s="real",int param=1000000007){if(s=="residue"){int MOD=param;add=[MOD](int a,int b){long long A=a,B=b;return (A+B)%MOD;};product=[MOD](int a,int b){long long A=a,B=b;return (A*B)%MOD;};in=[MOD](type a){int comp;return typeid(comp)==typeid(a) && 0<=a && a<MOD;};//引数が体の要素か否かadd_inverse=[MOD](int a){return (-a+MOD)%MOD;};product_inverse=[MOD](int a){long long temp=a;long long ans=1;int p=MOD-2;while(p>0){if(p%2){ans=(ans*temp)%MOD;}temp=(temp*temp)%MOD;p/=2;}int l=ans;return l;};one=1,zero=0;}else if(s=="real"){}}};template<typename type>class matrix{public:vector<vector<type>> value;field<type> f;matrix(vector<vector<type>> value,field<type> f){this->value=value;this->f=f;}matrix<type> operator + (matrix a){vector<vector<type>> ret(value.size(),vector<type>(a.value[0].size()));type temp;for(int i=value.size()-1;i>=0;--i){for(int j=value[0].size()-1;j>=0;--j){ret[i][j]=f.add(value[i][j],a.value[i][j]);}}return matrix(ret,f);}matrix<type> operator * (matrix a){vector<vector<type>> ret(value.size(),vector<type>(a.value[0].size()));type temp;for(int i=value.size()-1;i>=0;i--){for(int j=a.value[0].size()-1;j>=0;j--){temp=f.zero;for(int k=a.value.size()-1;k>=0;k--){temp=f.add(temp,f.product(value[i][k],a.value[k][j]));}ret[i][j]=temp;}}return matrix(ret,f);}matrix<type> pow(long long p){matrix temp(value,f);matrix ans=temp;bool flg=false;while(p>0){if(p%2){if(flg){ans=ans*temp;}else{flg=true;ans=temp;}}p=p/2;temp=temp*temp;}return ans;}matrix<type> reduct(){//行簡約化vector<vector<type>> ret=value;int N=ret.size(),M=ret[0].size();int determined=0;//定められた行の個数for(int i=0;i<M;++i){for(int j=determined;j<N;++j){if(ret[j][i]!=f.zero){for(int k=0;k<M;++k){swap(ret[determined][k],ret[j][k]);}type a=f.product_inverse(ret[determined][i]);for(int k=0;k<M;++k){ret[determined][k]=f.product(ret[determined][k],a);}for(int k=0;k<N;++k){if(k==determined){continue;}type c=f.add_inverse(ret[k][i]);for(int l=i;l<M;++l){ret[k][l]=f.add(ret[k][l],f.product(ret[determined][l],c));}}++determined;break;}}}matrix<type> R(ret,f);return R;}matrix<type> inv(){int N=value.size();int M=value[0].size();vector<vector<type>> memo(N,vector<type>(M*2));vector<vector<type>> ret(N,vector<type>(M));for(int i=0;i<N;++i){for(int j=0;j<M;++j){memo[i][j]=value[i][j];}for(int j=M;j<M*2;++j){memo[i][j]=(j-M==i?1:0);}}memo=matrix<type>(memo,f).reduct().value;for(int i=0;i<N;++i){for(int j=0;j<M;++j){ret[i][j]=memo[i][j+M];}}matrix<type> R(ret,f);return R;}};int main(){double a,b,c,d,e,f;cin>>a>>b>>c>>d>>e>>f;field<double> W("real");vector<vector<double>> v={{a,b},{d,e}};vector<vector<double>> r={{c},{f}};matrix<double> awt(v,W);matrix<double> bawta(r,W);matrix<double> cela=awt.inv()*bawta;cout<<cela.value[0][0]<<' '<<cela.value[1][0]<<endl;}