【2018.5.26】NOIP模拟赛

1.前言

今天题目太难了,所以只有250分。

2.题解

T1* 数列

1.1 题目

CfOEU1.png CfOAER.png CfOFb9.png

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 }
T1

猜你喜欢

转载自www.cnblogs.com/water-mi/p/9093015.html