結果
| 問題 | No.1036 Make One With GCD 2 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-04-24 21:40:12 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 1,174 bytes |
| コンパイル時間 | 1,739 ms |
| コンパイル使用メモリ | 174,944 KB |
| 実行使用メモリ | 95,360 KB |
| 最終ジャッジ日時 | 2024-11-07 19:54:03 |
| 合計ジャッジ時間 | 27,736 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 37 TLE * 4 |
ソースコード
#include <bits/stdc++.h>
#define rep(i,n)for(int i=0;i<n;i++)
using namespace std;
typedef pair<int,int>P;
typedef long long ll;
const int MOD=1000000007;
const int INF=0x3f3f3f3f;
const ll INFL=0x3f3f3f3f3f3f3f3f;
template<class T>
class SparseTable {
const int MAX_LOG=22;
vector<vector<T>>t;
vector<int>l2;
function<T(T,T)>F;
public:
int n;
T INIT;
void init(int n_,function<T(T,T)>f){
n=n_;
F=f;
t=vector<vector<T>>(MAX_LOG);
rep(i,MAX_LOG)t[i].assign(n,0);
l2.assign(n+1,0);
int k=0;
rep(i,n+1){
while((1<<(k+1))<=i)k++;
l2[i]=k;
}
}
void build(int n_,T*a,function<T(T,T)>f){
init(n_,f);
rep(i,n)t[0][i]=a[i];
for (int i=1;i<MAX_LOG;i++) {
for(int j=0;j+(1<<i)<=n;j++){
t[i][j]=F(t[i-1][j],t[i-1][j+(1<<(i-1))]);
}
}
}
T query(int a,int b) {
int l=l2[b-a];
return F(t[l][a],t[l][b-(1<<l)]);
}
};
ll a[600000];
int main(){
int n;cin>>n;
rep(i,n)scanf("%lld",&a[i]);
SparseTable<ll>seg;
seg.build(n,a,[](ll a,ll b){return __gcd(a,b);});
ll ans=0;
rep(i,n){
int ok=n,ng=i-1;
while(ok-ng>1){
int t=(ok+ng)/2;
if(seg.query(i,t+1)==1)ok=t;
else ng=t;
}
ans+=(n-1)-ok+1;
}
cout<<ans<<endl;
}