1.前言
今天题目太难了,所以只有250分。
2.题解
T1* 数列
1.1 题目
1.2 分析
这题重点在于对于后面这个$-3 -3 -3$,不难发现,这就是最后一个$LastAns$的相反数,我们不放设$k=LastAns$,于是就有:
$a*(i+1)*x_i^2+(b+1)*i*x_i+(c+i)=0\\\Rightarrow(a_0+k)*(i+1)*x_i^2+(b_0+k+1)*i*x_i+(c_0+k+i)=0\\\Rightarrow a_0*(i+1)*x_i^2+(b_0+1)*i*x_i+(c_0+i)=-k*(i+1)*x_i^2-k*i*x_i-k\\\Rightarrow a_0*(i+1)*x_i^2+(b_0+1)*i*x_i+(c_0+i)=-k[(i+1)*x_i^2+i*x_i+1]\\\Rightarrow k=-\frac{a_0*(i+1)*x_i^2+(b_0+1)*i*x_i+(c_0+i)}{(i+1)*x_i^2+i*x_i+1}$
由于$(i+1)*x_i^2$以及$i*x_i$都是分子分母都有的,且$a_0,b_0,c_0,i,x_i$都是已知量,所以可以算出$k$来
1.3 代码
1 #include <cstdio> 2 #include <cstring> 3 typedef long long ll; 4 5 ll tmp; 6 inline ll max(ll a,ll b){return a > b ? a : b;} 7 inline ll min(ll a,ll b){return a < b ? a : b;} 8 inline void swap(ll &a,ll &b){tmp = a,a = b,b = tmp;} 9 inline ll read(){ 10 ll val = 0,flag = 1; 11 char ch = getchar(); 12 while(ch != '-' && (ch < '0' || ch > '9')) ch = getchar(); 13 while(ch == '-') flag = -flag,ch = getchar(); 14 while(ch >= '0' && ch <= '9') 15 val = (val << 1) + (val << 3) + ch - '0',ch = getchar(); 16 return val * flag; 17 } 18 19 const ll N = 5e4 + 10,M = 5e5 + 10; 20 ll n,a[N],la; 21 ll x[M],y[M],z[M],cnt; 22 ll s[M],top; 23 inline ll calc(ll x,ll y,ll z,ll i,ll b,ll c){ 24 ll up = x * c + (y + 1) * b + z + i; 25 ll down = b + c + 1; 26 return -(up / down); 27 } 28 29 int main(){ 30 n = read(); 31 for(register ll i = 1;i <= n;++i) a[i] = read(); 32 while(scanf("%lld %lld %lld",x + 0,y + 0,z + 0) != EOF && ++cnt) 33 x[cnt] = x[0],y[cnt] = y[0],z[cnt] = z[0]; 34 la = 0 - x[cnt]; 35 for(register ll i = cnt - 1;i >= 1;--i){ 36 s[++top] = la; 37 ll b = la * a[la],c = (la + 1) * a[la] * a[la]; 38 la = calc(x[i],y[i],z[i],la,b,c); 39 } 40 while(top) printf("%lld\n",s[top--]); 41 return 0; 42 }