Pagini recente » Cod sursa (job #2067640) | Cod sursa (job #204120) | Cod sursa (job #1087324) | Cod sursa (job #404638) | Cod sursa (job #2580516)
//
// main.cpp
// indep
//
// Created by Eusebiu Rares on 13/03/2020.
// Copyright © 2020 Eusebiu Rares. All rights reserved.
//
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
/*
dp[i][j] = cate subsiruri din primele i numere au gcd j
*/
const int MV = 500 ;
const int MN = 1000 ;
const int BASE = 1e9 ;
FILE *in = fopen("indep.in", "r"), *out = fopen("indep.out", "w") ;
int v[MV + 1] ;
struct BigInt {
int nrcif;
int v[MV + 1];
BigInt () {
nrcif = 1;
memset (v, 0, sizeof (v));
}
BigInt (int val) {
do {
nrcif = 0 ;
v[++ nrcif] = val % 10 ;
val /= 10 ;
} while (val) ;
}
BigInt operator = (const BigInt &other) {
int i;
nrcif = other.nrcif;
for (i = 1; i <= nrcif; i++)
v[i] = other.v[i];
return *this;
}
BigInt operator += (const BigInt &other) {
int r, i;
nrcif = std::max (nrcif, other.nrcif);
r = 0;
for (i = 1; i <= nrcif; i++) {
v[i] = v[i] + r + other.v[i];
r = v[i] / BASE;
v[i] = v[i] % BASE;
}
if (r) {
nrcif++;
v[nrcif] = r;
}
return *this;
}
void afis () {
int i, p;
fprintf (out, "%d", v[nrcif]);
for (i = nrcif - 1; i > 0; i--) {
p = BASE / 10;
while (p > v[i]) {
p = p / 10;
fprintf (out, "0");
}
fprintf (out, "%d", v[i]);
}
fprintf (out,"\n");
}
void reset () {
int i;
for (i = nrcif; i > 0; i--) {
v[i]=0;
}
nrcif=0;
}
};
int gcd(int a, int b) {
if (b == 0) {
return a ;
}
return gcd(b, a % b) ;
}
BigInt dp[3][MN + 1] ;
void comp(int num, int i) {
for (int div = 1 ; div <= 1000 ; ++ div) {
dp[i % 2][gcd(div, num)] += dp[(i - 1) % 2][div] ;
dp[i % 2][div] += dp[(i - 1) % 2][div] ;
}
dp[i % 2][num] += BigInt(1) ;
for (int div = 1 ; div <= 1000 ; ++ div) {
dp[(i - 1) % 2][div].reset() ;
}
}
int main(int argc, const char * argv[]) {
int n ;
fscanf(in, "%d", &n) ;
for (int i = 1 ; i <= n ; ++ i) {
fscanf(in, "%d", v + i) ;
}
dp[1][v[1]] = 1 ;
for (int i = 2 ; i <= n ; ++ i) {
comp(v[i], i) ;
}
dp[n % 2][1].afis() ;
}