結果
| 問題 |
No.1084 積の積
|
| コンテスト | |
| ユーザー |
otamay6
|
| 提出日時 | 2020-06-19 22:19:20 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,806 bytes |
| コンパイル時間 | 1,403 ms |
| コンパイル使用メモリ | 170,480 KB |
| 実行使用メモリ | 13,756 KB |
| 最終ジャッジ日時 | 2024-07-03 14:57:03 |
| 合計ジャッジ時間 | 4,953 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 WA * 1 -- * 1 |
| other | TLE * 1 -- * 26 |
ソースコード
#include<bits/stdc++.h>
#define REP(i,n) for(int i=0,i##_len=int(n);i<i##_len;++i)
#define rep(i,a,b) for(int i=int(a);i<int(b);++i)
#define All(x) (x).begin(),(x).end()
#define rAll(x) (x).rbegin(),(x).rend()
using namespace std;
using ll = long long;
constexpr ll mod = 1e9+7;
template<typename T>
T npow(T x, ll n){
T ans = T(1);
while(n != 0){
if(n&1) ans = ans*x;
x = x*x;
n = n >> 1;
}
return ans;
}
class mint {
private:
ll _num,_mod=mod;
mint set(ll num){
_num = num ;
if(_num<0){
if(_num>=-_mod)_num=_mod+_num;
else _num=_mod-(-_num)%_mod;
}
else if(_num>=_mod) _num%=_mod;
return *this;
}
ll imod()const{
ll n=_mod-2;
ll ans = 1,x=_num;
while(n != 0){
if(n&1) ans = ans*x%_mod;
x = x*x%_mod;
n = n >> 1;
}
return ans;
}
public:
explicit mint(){ _num = 0; }
explicit mint(ll num){
_num = num;
if(_num<0){
if(_num>=-_mod)_num=_mod+_num;
else _num=_mod-(-_num)%_mod;
}
else if(_num>=_mod) _num%=_mod;
}
explicit mint(ll num,ll M){
_mod=M;
_num=num;
if(_num<0){
if(_num>=-_mod)_num=_mod+_num;
else _num=_mod-(-_num)%_mod;
}
else if(_num>=_mod) _num%=_mod;
}
mint(const mint &cp){_num=cp._num;_mod=cp._mod;}
mint operator+ (const mint &x)const{ return mint(_num + x._num , _mod); }
mint operator- (const mint &x)const{ return mint(_num - x._num , _mod);}
mint operator* (const mint &x)const{ return mint(_num * x._num , _mod); }
mint operator/ (const mint &x)const{ return mint(_num * x.imod() , _mod);}
mint operator+=(const mint &x){ return set(_num + x._num); }
mint operator-=(const mint &x){ return set(_num - x._num); }
mint operator*=(const mint &x){ return set(_num * x._num); }
mint operator/=(const mint &x){ return set(_num * x.imod());}
mint operator= (const ll x){ return set(x); }
mint operator+ (const ll x)const{return *this + mint(x,_mod); }
mint operator- (const ll x)const{ return *this - mint(x,_mod); }
mint operator* (const ll x)const{ return *this * mint(x,_mod); }
mint operator/ (const ll x)const{ return *this/mint(x,_mod);}
mint operator+=(const ll x){ *this = *this + x;return *this; }
mint operator-=(const ll x){ *this = *this - x;return *this; }
mint operator*=(const ll x){ *this = *this * x;return *this;}
mint operator/=(const ll x){ *this = *this / x;return *this;}
bool operator==(const mint &x)const{return _num==x._num;}
bool operator!=(const mint &x)const{return _num!=x._num;}
friend mint operator+(ll x,const mint &m){return mint(m._num + x , m._mod);}
friend mint operator-(ll x,const mint &m){return mint( x - m._num , m._mod);}
friend mint operator*(ll x,const mint &m){return mint(m._num * (x % m._mod) , m._mod);}
friend mint operator/(ll x,const mint &m){return mint(m.imod() * (x % m._mod) , m._mod);}
explicit operator ll() { return _num; }
explicit operator int() { return (int)_num; }
friend std::ostream& operator<<(std::ostream &os, const mint &x){ os << x._num; return os; }
friend std::istream& operator>>(std::istream &is, mint &x){ll val; is>>val; x.set(val); return is;}
};
int main(){
int N;cin>>N;
vector<ll> A(N);
REP(i,N) cin>>A[i];
mint ans(1);
ll s = 1;
int j = 0;
vector<int> l(N),r(N);
REP(i,N){
while(j<N && s*A[j] < static_cast<int>(1e9)){
if(A[j]==0){
cout<<0<<endl;
return 0;
}
s *= A[j];
l[j] = j-i+1;
++j;
}
s/=A[i];
r[i] = j-i;
}
REP(i,N) ans *= npow(mint(A[i]),l[i]*r[i]);
cout<<ans<<endl;
}
otamay6