結果
| 問題 |
No.1239 Multiplication -2
|
| コンテスト | |
| ユーザー |
pockyny
|
| 提出日時 | 2020-09-25 22:25:11 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 107 ms / 2,000 ms |
| コード長 | 1,749 bytes |
| コンパイル時間 | 745 ms |
| コンパイル使用メモリ | 69,120 KB |
| 最終ジャッジ日時 | 2025-01-14 21:06:29 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 34 |
ソースコード
#include <iostream>
using namespace std;
typedef long long ll;
ll mod = 998244353,inv[200010],b[4] = {},ans1 = 0,ans2 = 0,a[200010];
ll pw(ll a,ll x){
ll ret = 1;
while(x){
if(x&1) (ret *= a) %= mod;
(a *= a) %= mod; x /= 2;
}
return ret;
}
int main(){
int i,n; cin >> n;
for(i=0;i<n;i++) cin >> a[i];
if(n==1){
if(a[0]==-2) cout << 1 << endl;
else cout << 0 << endl;
return 0;
}
inv[0] = 1,inv[1] = (mod + 1)/2;
for(i=2;i<=n;i++) inv[i] = inv[i - 1]*inv[1]%mod;
ll c = a[0];
if(c==-2) (ans1 += inv[1]) %= mod;
for(i=1;i<n - 1;i++){
c *= a[i];
if(c>2 || c<-2 || c==0) break;
if(c==-2) (ans1 += inv[i + 1]) %= mod;
}
c = a[n - 1];
if(c==-2) (ans1 += inv[1]) %= mod;
for(i=n - 2;i>=1;i--){
c *= a[i];
if(c>2 || c<-2 || c==0) break;
if(c==-2) (ans1 += inv[n - i]) %= mod;
}
c = 1;
for(i=0;i<n;i++){
c *= a[i];
if(c>2 || c<-2) break;
}
if(c==-2) (ans1 += inv[n - 1]) %= mod;
//b[0]=-2,b[1]=-1,b[2]=1,b[3]=2
for(i=1;i<n - 1;i++){
if(a[i]==-2){
b[0] = (b[2] + pw(2,i))%mod; b[3] = b[1]; b[1] = b[2] = 0;
}
if(a[i]==-1){
swap(b[0],b[3]); swap(b[1],b[2]); (b[1] += pw(2,i)) %= mod;
}
if(a[i]==0){
b[0] = b[1] = b[2] = b[3] = 0;
}
if(a[i]==1){
(b[2] += pw(2,i)) %= mod;
}
if(a[i]==2){
(b[3] = b[2] + pw(2,i)) %= mod; b[0] = b[1]; b[1] = b[2] = 0;
}
(ans2 += inv[i]*b[0]%mod) %= mod;
}
(ans2 *= inv[2]) %= mod;
//cout << ans1 << " " << ans2*4%mod << endl;
cout << (ans1 + ans2)%mod << endl;
}
pockyny