题解 P6393 【隔离的日子】
这道题还是比较简单,我相信
首先我们观察式子:
发现这个式子非常地不好看,我们想要把下标相同放在一块儿(方便预处理维护),所以我们把式子括号拆开,得:
移项合并同类项,提取公因式得:
我们设
则有:
和
因此我们就列出这样一个不定方程组,只要知道了一个未知项就可以知道其他项。
因此我们考虑枚举
如果还有不懂的可以去看看下面的代码:
#include <map>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 5e4 + 5;
map <pair<int , int> , int> M;
int n , a[MAXN] , b[MAXN] , ans[MAXN];
signed main() {
// freopen("11.in" , "r" , stdin);
// freopen("11.out" , "w" , stdout);
scanf("%d" , &n);
for (int i = 1; i <= n; ++i) {
scanf("%d %d" , &a[i] , &b[i]);
}
for (int i = n; i >= 1; --i) {
int res = 1e9;
for (int j = 1; j <= b[i]; ++j) {
if(b[i] * b[i] % j == 0) {
int x = 0 , y = 0;
if(M[make_pair(a[i] + b[i] + j , b[i] * b[i] / j)]) {
x = M[make_pair(a[i] + b[i] + j , b[i] * b[i] / j)];
}
if(M[make_pair(a[i] + b[i] + b[i] * b[i] / j , j)]) {
y = M[make_pair(a[i] + b[i] + b[i] * b[i] / j , j)];
}
if(x) res = min(res , x);
if(y) res = min(res , y);
}
}
if(res != 1e9) ans[i] = res;
else ans[i] = -1;
M[make_pair(a[i] , b[i])] = i;
}
for (int i = 1; i <= n; ++i) printf("%d\n" , ans[i]);
return 0;
}