結果
| 問題 | 
                            No.1092 modular arithmetic
                             | 
                    
| ユーザー | 
                             ytft
                         | 
                    
| 提出日時 | 2021-05-03 10:04:03 | 
| 言語 | C++14  (gcc 13.3.0 + boost 1.87.0)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 443 ms / 2,000 ms | 
| コード長 | 1,654 bytes | 
| コンパイル時間 | 5,049 ms | 
| コンパイル使用メモリ | 386,424 KB | 
| 実行使用メモリ | 5,376 KB | 
| 最終ジャッジ日時 | 2024-07-21 22:54:47 | 
| 合計ジャッジ時間 | 11,603 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge4 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 1 | 
| other | AC * 32 | 
ソースコード
#include <bits/stdc++.h>
using namespace std;
#include <boost/multiprecision/cpp_int.hpp>
namespace mp=boost::multiprecision;
class residue_ring{
public:
    mp::cpp_int mod;//法
    mp::cpp_int value;//値
    residue_ring(mp::cpp_int a,mp::cpp_int m){
        mod=m;
        value=a%m+(a<0?m:0);
    }
    residue_ring operator * (residue_ring a){
        return residue_ring(value*a.value,mod);
    }
    residue_ring operator - (residue_ring a){
        return residue_ring(value-a.value,mod);
    }
    residue_ring operator + (residue_ring a){
        return residue_ring(value+a.value,mod);
    }
    residue_ring operator ^ (mp::cpp_int a){
        residue_ring ret(1,mod);
        residue_ring temp(value,mod);
        while(a>0){
            if(a%2){
                ret=ret*temp;
            }
            temp=temp*temp;
            a/=2;
        }
        return ret;
    }
    residue_ring operator / (residue_ring a){//modが素数の場合のみ使用可能
        a=a^(mod-2);
        return residue_ring(value*a.value,mod);
    }
    
};
int main(){
    int P,N;
    cin>>P>>N;
    int temp;
    vector<int> A(N);
    for(int i=0;i<N;i++){
        cin>>A[i];
    }
    string S;
    residue_ring ret(A[0],P);
    cin>>S;
    for(int i=0;i<N-1;i++){
        residue_ring temp(A[i+1],P);
        switch(S[i]){
            case '+':
            ret=ret+temp;
            break;
            case '-':
            ret=ret-temp;
            break;
            case '*':
            ret=ret*temp;
            break;
            case '/':
            ret=ret/temp;
            break;            
        }
    }
    cout<<ret.value<<endl;
}
            
            
            
        
            
ytft