結果
| 問題 | No.983 Convolution |
| コンテスト | |
| ユーザー |
nikutto_
|
| 提出日時 | 2020-02-12 19:30:58 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,662 bytes |
| コンパイル時間 | 1,444 ms |
| コンパイル使用メモリ | 174,712 KB |
| 実行使用メモリ | 52,560 KB |
| 最終ジャッジ日時 | 2024-10-04 03:40:07 |
| 合計ジャッジ時間 | 8,594 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 27 WA * 6 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
using ll=__int128;
struct T{
ll v;
long long cnt;
long long bad;
};
T operator+(T lhs,T rhs){
return T{lhs.v+rhs.v,lhs.cnt+rhs.cnt,lhs.bad+rhs.bad};
}
T operator-(T lhs,T rhs){
return T{lhs.v-rhs.v,lhs.cnt-rhs.cnt,lhs.bad-rhs.bad};
}
T operator*(T lhs,T rhs){
return T{lhs.v*rhs.v,lhs.cnt*rhs.cnt,lhs.bad*rhs.cnt+lhs.cnt*rhs.bad-lhs.bad*rhs.bad};
}
ll mygcd(ll a,ll b){
return b==0 ? a : mygcd(b,a%b);
}
const int LOG_N=18;
const int MAX_N=1<<LOG_N;
T B[MAX_N];
void solve(int step,vector<T> A,int mask){
if(A.size()==1){
B[mask]=B[mask]+A[0]*A[0];
return;
}
vector<T> odd(A.size()/2);
for(int i=1;i<A.size();i+=2) odd[i/2]=A[i];
solve(step+1,odd,mask+(1<<step));
vector<T> even(A.size()/2);
for(int i=0;i<A.size();i++) even[i/2]=even[i/2]+A[i];
solve(step+1,even,mask);
for(int i=0;i<A.size()/2;i++){
int id = ((i*2)<<step)+mask;
B[id]=B[id]-B[id+1];
}
}
string to_str(ll v){
string res;
while(v){
res+=('0'+v%10);
v/=10;
}
reverse(res.begin(),res.end());
return res;
}
int main(){
int n;
cin>>n;
vector<T> A(MAX_N);
for(int i=0;i<n;i++){
long long tmp;
cin>>tmp;
if(tmp==-1) A[i]={0,1,-1};
else A[i]={tmp,1,0};
}
solve(0,A,0);
vector<ll> B2(MAX_N);
for(int i=0;i<MAX_N;i++){
if(B[i].bad==0) B2[i]=B[i].v;
else B2[i]=0;
}
ll ans=0;
for(int i=0;i<n;i++){
ans=mygcd(ans,B2[i]);
}
if(ans==0) cout<<-1<<endl;
else cout<<to_str(ans)<<endl;
return 0;
}
nikutto_