| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 1238955 | noop | Hack (APIO25_hack) | C++20 | 0 ms | 0 KiB | 
// #include "hack.h"
#include <bits/stdc++.h>
using namespace std;
static int n = 0;
static int total_cost = 0;
long long collisions(std::vector<long long> x){
    total_cost += (int) x.size();
    if (total_cost > 1000000){
        printf("Total cost exceeded 1,000,000\n");
        exit(0);
    }
    
    long long res = 0;
    std::map<int, int> table;
    std::set<long long> seen;
    for (long long v : x){
        if (v < 1 || v > (long long)1e18){
            printf("x[i] is out of range\n");
            exit(0);
        }
        if (seen.find(v) != seen.end()){
            printf("x has a duplicate element\n");
            exit(0);
        }
        seen.insert(v);
        
        res += table[v % n];
        table[v % n]++;
    }
    return res;
}
bool query (int l, int r){
    int gap=sqrt(r-l+1);
    vector<long long> v;
    for (int i=1; i<=gap; ++i)
        v.push_back(i);
    for (int i=r+1; i>l+gap; i-=gap)
        v.push_back(i);
    return collisions(v);
}
int hack(){
    int l=1,r=1000000000;
    while (l<r){
        int mid=l+r>>1;
        if (query(l,mid))
            r=mid;
        else
            l=mid+1;
    }
    return l;
}
int main(){
    int t;
    assert(1 == scanf("%d", &t));
    std::vector<int> ns(t);
    for (int i = 0; i < t; i++){
        assert(1 == scanf("%d", &ns[i]));
    }
    for (int i = 0; i < t; i++){
        total_cost = 0;
        n = ns[i];
        int ans = hack();
        printf("%d %d\n", ans, total_cost);
    }
    return 0;
}
