[2020 去世模拟赛 2] 一道防AK好题

题目

题目描述

\(\sf{Lemon}\) 认为在第一届『\(\rm Citric\)』杯模拟赛中出的题目太简单了,于是他决定,这次要给参赛选手们一个下马威!^_^

\(\sf{Lemon}\) 手上有一个长度为 \(n\) 的数列 \(x\)。他现在想知道,对于给定的 \(a,b,c\),他要找到一个 \(i\),使得 \(a\cdot (i+1)\cdot x_i^2+(b+1)\cdot i\cdot x_i+(c+i)=0\) 成立。
如果有多个 \(i\) 满足,\(\sf{Lemon}\) 想要最小的那个 \(i\)
\(\sf{Lemon}\) 有很多很多组询问需要你回答,多到他自己也不确定有多少组。所以在输入数据中 \(a=b=c=0\) 标志着 \(\sf{Lemon}\) 的提问的结束。

更加糟糕的是,\(\sf{Lemon}\) 为了加大难度,决定对数据进行加密以防止离线算法的出现。
假设你在输入文件中读到的三个数为 \(a_0,b_0,c_0\),那么 \(\sf{Lemon}\) 真正要询问的 \(a=a_0+lst,b=b_0+lst,c=c_0+lst\)\(lst\) 的值是你对 \(\sf{Lemon}\) 的前一个询问的回答。如果这是第一个询问,那么 \(lst=0\)
所有的询问都将会按上述方式进行加密,包括标志着询问的结束的那个询问也是这样。

输入格式

输入文件第一行包含一个正整数 \(n\),表示数列的长度。
输入文件第二行包含 \(n\) 个整数,第 \(i\) 个数表示 \(x_i\) 的值。
接下来若干行,每行三个数,表示加密后的 \(a,b,c\) 值。

输出格式

包含若干行,第 \(i\) 行的值是输入文件中第 \(i\) 个询问的答案。注意,你不需要对标志着询问结束的那个询问作答。
同时,标志着询问结束的询问一定是输入文件的最后一行。也就是,输入文件不会有多余的内容。

样例输入

5
-2 3 1 -5 2 
-5 -4 145
-1 -6 -509
-9 -14 40
-3 -13 21
-3 -3 -3

样例输出

5
4
3
3

数据范围与提示

\(n\le 50000\),需要作出回答的询问个数不超过 \(500000\)\(|x_i|\le 30000\)

解密后的 \(a\) 的绝对值不超过 \(50000\),解密后的 \(b\) 的绝对值不超过 \(10^8\),解密后的 \(c\) 的绝对值不超过 \(10^{18}\)

解法

为啥这成为我访问量最多的博客了,是因为有 AK 吗?

询问的结束也遵循加密方式?那么最后一个提问的答案不就是 \(-a\) 吗?将答案代回式子,就可以解出上个提问的答案。

没了。

代码

#include <cstdio>
typedef long long ll;

int n, cnt;
ll x[50005], A, B, C, id, ans[500005];
struct node {
    ll a, b, c;
    node() {}
    node(const ll x, const ll y, const ll z) {a = x, b = y, c = z;}
}q[500005];

int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; ++ i) scanf("%lld", &x[i]);
    while(scanf("%lld %lld %lld", &A, &B, &C) != -1)
        q[++ cnt] = node(A, B, C);
    id = -q[cnt].a;
    ans[cnt] = id;
    for(int i = cnt - 1; i >= 1; -- i) {
        ll chu = (0ll + x[id] * x[id] * (id + 1) + x[id] * id + 1);
        if(chu == 0) ans[i] = 1;
        else ans[i] = -(0ll + q[i].a * (id + 1) * x[id] * x[id] + x[id] * id * (q[i].b + 1) + q[i].c + id) / chu;
        id = ans[i];
    }
    for(int i = 2; i <= cnt; ++ i) printf("%lld\n", ans[i]);
    return 0;
}
原文地址:https://www.cnblogs.com/AWhiteWall/p/12403095.html