Pages

HACKER RANK TEST 38

Hyperrectangle GCD





#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
    
using namespace std;
    
const int MOD = (int)1e9 + 7;
    
int a[510];
int cnt[100100];
int inv[100100];
vector <int> ev[100100];
    
void add(int &a, int b) {
    a += b;
    if (a >= MOD) a -= MOD;
}
    
int binpow(int a, int n) {
    if (n == 0) return 1;
    if (n % 2 == 1) return (long long)a * binpow(a, n - 1) % MOD;
    int t = binpow(a, n / 2);
    return (long long)t * t % MOD;
}
    
int clever(int* v, int n) {
    int mx = *max_element(v, v + n);
    memset(cnt, 0, 4 * (mx + 1));
    for (int i = 1; i <= mx; i++) ev[i].clear();
    for (int i = 0; i < n; i++) {
        int bound = 1, cur = v[i];
        while (cur > 0) {
            int L = bound, R = v[i] + 1;
            while (L + 1 < R) {
                int M = (L + R) / 2;
                if (v[i] / M < cur) {
                    R = M;
                } else {
                    L = M;
                }
            }
            ev[L].push_back(v[i]);
            bound = L + 1;
            cur = v[i] / (L + 1);
        }
    }
    long long cur = 1;
    for (int i = 0; i < n; i++) cur *= v[i], cur %= MOD;
    for (int i = 1; i <= mx; i++) {
        if (cur == 0) break;
        cnt[i] = (int)cur;
        if (i == mx) break;
        for (int j = 0; j < ev[i].size(); j++) {
            cur *= inv[ev[i][j] / i];
            cur %= MOD;
            cur *= (ev[i][j] / (i + 1));
            cur %= MOD;
        }
    }
    for (int i = mx; i >= 1; i--) {
        for (int j = 2 * i; j <= mx; j += i) {
            cnt[i] -= cnt[j];
            if (cnt[i] < 0) {
                cnt[i] += MOD;
            }
        }
    }
    int res = 0;
    for (int i = 0; i <= mx; i++) add(res, (long long)cnt[i] * i % MOD);
    return res;
}
    
int main() {
    for (int i = 1; i < 100100; i++) {
        inv[i] = binpow(i, MOD - 2);
    }
    int t;
    scanf("%d", &t);
    while (t--) {
        int n;
        scanf("%d", &n);
        for (int i = 0; i < n; i++) scanf("%d", &a[i]);
        printf("%d\n", clever(a, n));
    }
    return 0;
}


;;;;;;;


Lego Blocks




#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
 
using namespace std;
  
#define mo(m) if(m > 1000000007) m = m%1000000007
 
 
 
void solve(){
    int t,hMax = 0,wMax = 0;
 
    cin >> t;
    vector <int> vH(t);
    vector <int> vW(t);
 
    for(int i = 0; i < t;i++){
        cin >> vH[i] >> vW[i];
        if(vH[i] > hMax)
            hMax = vH[i];
 
        if(vW[i] > wMax)
            wMax = vW[i];
    }
    if(hMax < 4)
        hMax = 4;
    if(wMax < 4)
        wMax = 4;
 
    vector <int> rNumb(wMax + 1,0);
    vector <vector <int> > rNumbPwh(hMax + 1,rNumb);
    vector <vector <int> > rt(hMax + 1,rNumb);
    vector <int> hNumb(hMax + 1,0);
 
    for(int i = 0; i < t;i++){
        if(vW[i] > hNumb[vH[i]])
             hNumb[vH[i]] = vW[i];
    }
 
    rNumb[0] = 1;
    rNumb[1] = 1;
    rNumb[2] = 2;
    rNumb[3] = 4;
    rNumb[4] = 8;
 
    for(int i = 5; i <= wMax; i++){
        rNumb[i] += rNumb[i-4];
        mo(rNumb[i]);
        rNumb[i] += rNumb[i-3];
        mo(rNumb[i]);
        rNumb[i] += rNumb[i-2];
        mo(rNumb[i]);
        rNumb[i] += rNumb[i-1];
        mo(rNumb[i]);
    }
 
    for(int i = 1; i <= wMax; i++){
        long long rNumbTimes = rNumb[i];
        for(int j = 1;j <= hMax ;j++){
            rNumbPwh[j][i] =  rNumbTimes;
            rNumbTimes *= rNumb[i];
            mo(rNumbTimes);
        }
    }
 
    rt[1][1] = 1;
    rt[1][2] = 1;
    rt[1][3] = 1;
    rt[1][4] = 1;
 
    for(int i = 2 ; i <= hMax ; i++)
        rt[i][1] = 1;
 
 
    for(int j = 2;j <= hMax ;j++){
        for(int i = 2; i <= hNumb[j]; i++){
            long long rTemp = rNumbPwh[j][i];
            for(int k = 1 ;k < i ; k++){
                long long rTemp2 = ((long long) rt[j][k] )* ((long long) rNumbPwh[j][i-k]);
                mo(rTemp2);
 
                if(rTemp2 > rTemp){
                    rTemp = rTemp + 1000000007 - rTemp2;
                }
                else
                    rTemp -= rTemp2;
            }
            rt[j][i] = rTemp;
        }
    }
 
    for(int i = 0; i < t;i++){
        cout << rt[vH[i]][vW[i]]<<endl;
    }
}
 
 
 
int main(){
    solve();
    return 0;
}


;;;;;;;;;


Largest Non-Coprime Submatrix

#include <bits/stdc++.h>
using namespace std;
int n, m;
const int mx = 200;
vector<int> h;
int a[mx + 10][mx + 10];
int b[mx + 10][mx + 10];
vector<int> s;
int Histogram(vector<int>& height)
{
    s.clear();
    height.push_back(0);
    int sum = 0;
    int i = 0;
    while (i < height.size()) {
        if (s.empty() || height[i] > height[s.back()]) {
            s.push_back(i);
            i++;
        }
        else {
            int t = s.back();
            s.pop_back();
            sum = max(sum, height[t] * (s.empty() ? i : i - s.back() - 1));
        }
    }
    return sum;
}
int isPrime(int x)
{
    int i;
    if (x < 2)
        return false;
    for (i = 2; i * i <= x; i++)
        if (x % i == 0)
            return false;
    return true;
}
int main(void)
{
    int i, j, k, kase = 0;
    cin >> n >> m;
    for (i = 0; i < n; i++)
        for (j = 0; j < m; j++)
            cin >> a[i][j];
    int prime;
    int ans = 0;
    h.resize(m, 0);
    for (prime = 0; prime < 10000; prime++) {
        if (!isPrime(prime))
            continue;
        for (i = 0; i < n; i++)
            for (j = 0; j < m; j++)
                b[i][j] = ((a[i][j] % prime) == 0);
        h.assign(m, 0);
        int base;
        for (base = 0; base < n; base++) {
            for (i = 0; i < m; i++) {
                if (b[base][i])
                    h[i] += b[base][i];
                else
                    h[i] = 0;
            }
            ans = max(ans, Histogram(h));
        }
    }
    cout << ans << endl;
    return 0;
}
;;;;;;;;;;;;;;;;;;;;;;







Anonymous