結果
| 問題 |
No.1036 Make One With GCD 2
|
| ユーザー |
|
| 提出日時 | 2020-04-26 05:34:27 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 184 ms / 2,000 ms |
| コード長 | 3,004 bytes |
| コンパイル時間 | 1,057 ms |
| コンパイル使用メモリ | 54,232 KB |
| 最終ジャッジ日時 | 2025-01-10 01:52:17 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 41 |
ソースコード
#include <cstdio>
#include <stack>
#include <unistd.h>
struct IO {
static const int bufsize=1<<24;
char ibuf[bufsize], obuf[bufsize];
char *ip, *op;
IO(): ip(ibuf), op(obuf) { for(int t = 0, k = 0; (k = read(STDIN_FILENO, ibuf+t, sizeof(ibuf)-t)) > 0; t+=k); }
~IO(){ for(int t = 0, k = 0; (k = write(STDOUT_FILENO, obuf+t, op-obuf-t)) > 0; t+=k); }
long long scan_int(){
long long x=0;
bool neg=false;
for(;*ip<'+';ip++) ;
if(*ip=='-'){ neg=true; ip++;}
else if(*ip=='+') ip++;
for(;*ip>='0';ip++) x = 10*x+*ip-'0';
if(neg) x = -x;
return x;
}
void put_int(long long x, char c=0){
static char tmp[20];
if(x==0) *op++ = '0';
else {
int i;
if(x<0){
*op++ = '-';
x = -x;
}
for(i=0; x; i++){
tmp[i] = x % 10;
x /= 10;
}
for(i--; i>=0; i--)
*op++ = tmp[i]+'0';
}
if(c) *op++ = c;
}
void put_double(double x, char c=0){
unsigned y;
const int mask = (1<<24) - 1;
put_int(x);
*op++ = '.';
x = x - (int) x;
if(x < 0) x = -x;
y = x * (1<<24);
for(int i=0;i<7;i++){
y *= 10;
*op++ = '0' + (y>>24);
y &= mask;
}
if(c) *op++ = c;
}
inline char scan_char(){ return *ip++; }
inline void put_char(char c){ *op++ = c; }
inline char *scan_string(){ char *s = ip; while(*ip!='\n'&&*ip!=' ') ip++; *ip++='\0'; return s;}
inline void put_string(const char *s, char c=0){ while(*s) *op++=*s++; if(c) *op++=c;}
} io;
using u64 = unsigned long long int;
u64 bgcd(u64 x, u64 y){
if(x == 0 || y == 0) return x^y;
int bx = __builtin_ctzll(x);
int by = __builtin_ctzll(y);
int k = (bx < by) ? bx : by;
x >>= bx;
y >>= by;
while(x!=y){
if(x < y){
y -= x;
y >>= __builtin_ctzll(y);
}
else {
x -= y;
x >>= __builtin_ctzll(x);
}
}
return x << k;
}
struct u64GCDMonoid {
using element_type = u64;
static u64 op(u64 x, u64 y) {
return bgcd(x, y);
}
static constexpr u64 id = 0;
};
template <typename M>
struct swag {
using T = typename M::element_type;
std::stack<T> r, cl, cr;
swag(){
cl.push(M::id);
cr.push(M::id);
}
void push_back(const T &x){ r.push(x); cr.push(M::op(cr.top(), x)); };
void pop_front(){
if(cl.size() == 1){
while(r.size() != 1){
cl.push(M::op(cl.top(), r.top()));
r.pop();
cr.pop();
}
r.pop();
cr.pop();
}
else {
cl.pop();
}
}
T fold() const {
return M::op(cl.top(), cr.top());
}
};
int n;
u64 A[500001];
int main(){
n = io.scan_int();
for(int i = 0; i < n; i++) A[i] = io.scan_int();
swag<u64GCDMonoid> s;
u64 ans = 0;
int r = 0;
s.push_back(0);
for(int l = 0; l <= r; l++){
s.pop_front();
for(; r <= n; r++){
if(s.fold() == 1){
// printf("(%d, %d) ", l, r-1);
ans += n - r + 1;
break;
}
s.push_back(A[r]);
}
}
io.put_int(ans, '\n');
return 0;
}