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];elseh[i] = 0;}ans = max(ans, Histogram(h));}}cout << ans << endl;return 0;};;;;;;;;;;;;;;;;;;;;;;





