Cod sursa(job #1968896)

Utilizator MithrilBratu Andrei Mithril Data 17 aprilie 2017 22:55:31
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <bits/stdc++.h>
#define NMAX 1010
#define LGMAX 11
#define GET_SIZE(x) (((double)sizeof(x))/1024/1024)

using namespace std;

ifstream fin("xcmmdc.in");
ofstream fout("xcmmdc.out");

int n,m,q,l,k,limit;
int rmq[LGMAX][NMAX][NMAX];
int loga[NMAX];
int answer[NMAX];

int query(int x,int y,int d) {
    int log=loga[d],t1,t2,t3,t4,x1,y1;
    d--;
    x1=x+d;
    y1=y+d;

    t1=rmq[log][x][y];
    t2=rmq[log][x1-(1<<log)+1][y];
    t3=rmq[log][x][y1-(1<<log)+1];
    t4=rmq[log][x1-(1<<log)+1][y1-(1<<log)+1];

    return __gcd(__gcd(t1,t2),__gcd(t3,t4));
}

int main()
{
    fin>>n>>m>>k>>q;
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=m;j++) {
            fin>>rmq[0][i][j];
        }
    }

    limit =max(n,m);

    for(int i=2;i<NMAX;i++) {
        loga[i]=loga[i/2]+1;
    }

    for(int log=1;(1<<log)<=limit;log++) {
        for(int i=1;i+(1<<log)-1<=n;i++) {
            for(int j=1;j+(1<<log)-1<=m;j++) {
                int len=(1<<(log-1));
                rmq[log][i][j]=__gcd(
                    __gcd(rmq[log-1][i][j],rmq[log-1][i+len][j]),
                    __gcd(rmq[log-1][i][j+len],rmq[log-1][i+len][j+len])
                    );
            }
        }
    }

    for(int aux=1;aux<=limit;aux++) {
        for(int i=1;i+aux-1<=n;i++) {
            for(int j=1;j+aux-1<=m;j++) {
                if(query(i,j,aux)==k) {
                    answer[aux]++;
                }
            }
        }
    }

    for(int t=1;t<=q;t++) {
        fin>>l;
        fout<<answer[l]<<'\n';
    }
    return 0;
}