2 条题解
-
0
设 为 数列的前缀和,那么题目给出的方程可统统化为如下形式:
联立相邻的两方程:
$$x_{i+1}p_{i+1}+y_{i+1}p_n-y_{i+1}p_{i}\equiv z_{i+1}\pmod {10^9+7} $$借用上面的方程,消掉下面的方程中 项。
消完之后运用最后一个方程解出 的值,一路往上回代即可。
无解和多解,考虑最后一个方程被消元后的结果:
当 且 时, 有 个解。
当 且 时, 有 个解。
这玩意时间复杂度是 的,实现的不精细是 的
void solve() { n=read(); for(int i=1;i<=n;i++) x[i]=read(),y[i]=read(),z[i]=read(); if(n==1) { if(add(x[1],y[1])==0) { if(z[1]==0) write(mod); else write(0); enter; return; } write(1),enter; write(1ll*z[1]*fpow(add(x[1],y[1]),mod-2)%mod);enter; return; } for(int i=2;i<n;i++) { int tmp=1ll*y[i]*fpow(x[i-1],mod-2)%mod; y[i]=add(1ll*y[i-1]*tmp%mod,y[i]); z[i]=add(1ll*z[i-1]*tmp%mod,z[i]); } int tmp1=add(x[n],add(y[n],1ll*y[n-1]*y[n]%mod*fpow(x[n-1],mod-2)%mod)); int tmp2=add(z[n],1ll*z[n-1]*y[n]%mod*fpow(x[n-1],mod-2)%mod); if(tmp1==0) { if(tmp2==0) write(mod); else write(0); enter;return; } pre[n]=1ll*tmp2*fpow(tmp1,mod-2)%mod; for(int i=1;i<n;i++) pre[i]=1ll*del(z[i],1ll*y[i]*pre[n]%mod)*fpow(x[i],mod-2)%mod; write(1),enter; for(int i=1;i<=n;i++) write(del(pre[i],pre[i-1])),space; enter; }
信息
- ID
- 208
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 258
- 已通过
- 17
- 上传者