Cod sursa(job #2580516)

Utilizator rares404AlShaytan - Balasescu Rares rares404 Data 13 martie 2020 18:22:22
Problema Indep Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.29 kb
//
//  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() ;
}