2021牛客OI赛前集训营-提高组(第三场) 第二题 交替 题解与结论证明
题目描述
一个长度为 \(n\) 的数组\(A\),每秒都会变成一个长度为 \(n − 1\) 新数组 \(A'\),其变化规
则如下:
若当前数组 \(A\) 的长度 \(n\) 为偶数,则对于新数组 \(A'\) 的每一个位置 \(i(1 ≤ i < n)\)来说,\(A'[i]=A[i]+A[i+1]\)
若当前数组 \(A\) 的长度 \(n\) 为奇数,则对于新数组 \(A'\) 的每一个位置 \(i(1 ≤ i < n)\)来说,\(A'[i]=A[i]-A[i+1]\)
最终数组经过 \(n − 1\) 秒的时间变成一个数字。求这个数字对 \(10^9 + 7\)取模后的结果。
输入格式
第一行输入一个正整数\(n\),表示数组的长度。
接下来每行输入\(n\)个正整数,表示数组中的每一个元素。
输出格式
输出一行一个整数表示答案。
样例
输入样例1
3
1 6 8
输出样例1
1000000000
样例解释1
第一秒的时候进行第二种变化,即 \(A\)数组由 \([1, 6, 8]\) 变为\([-5, -2]\),然后第二秒的时候,由于此时数组长度为 \(2\),所以进行第一种变化,即数组变为 \([-7]\),最终输出这个数字对\(10^9 + 7\)取模后的结果,所以输出 \(1000000000\)。
数据范围
对于 \(40\%\) 的数据,满足 \(n ≤ 1000\)。
对于 \(100\%\) 的数据,满足 \(1 ≤ n ≤ 10^5,1 ≤ ai ≤ 10^9\)。
题目简化
对于一个长度为\(n\)的数组\(A\),反复进行以下操作,直到\(n=1\)。
- 如果\(n\equiv 0\pmod 2\),则\(A_i\gets A_i+A_{i+1}\)
- 如果\(n\equiv 1\pmod 2\),则\(A_i\gets A_i-A_{i+1}\)
- \(n\gets n-1\)
最后输出 \(A_1\)
题解
这道题我用的是打表找规律,先来看看奇数。
当 \(n=1\) 时,得
\]
当 \(n=3\) 时,得
A_1-A_2,A_2-A_3\\
A_1-A_3
\]
当 \(n=5\) 时,得
A_1-A_2,A_2-A_3,A_3-A_4\\
A_1-A_3,A_2-A_4,A_3-A_5\\
A_1-A_2-A_3+A_4,A_2-A_3-A_4+A_5\\
A_1-2\times A_3+A_5
\]
这时候我们初步发现规律,再来一组?当\(n=7\)时,得
A_1-A_2,A_2-A_3,A_3-A_4,A_4-A_5,A_5-A_6,A_6-A_7\\
A_1-A_3,A_2-A_4,A_3-A_5,A_4-A_6,A_5-A_7\\
A_1-A_2-A_3+A_4,A_2-A_3-A_4+A_5,A_3-A_4-A_5+A_6,A_4-A_5-A_6+A_7\\
A_1-2\times A_3+A_5,A_2-2\times A_4+A_6,A_3-2\times A_5+A_7\\
A_1-A_2-2\times A_3+2\times A_4+A_5-A_6,A_2-A_3-2\times A_4+2\times A_5+A_6-A_7\\
A_1-3\times A_3+3\times A_5-A_7
\]
观察系数,列出一个表格:
1,-1\\
1,-2,1\\
1,-3,3,-1\\
\]
从数字来看:杨辉三角,从符号来看:奇正偶负。
用式子来表达规律:\(ans=\sum\limits_{i=0}^n(-1)^{i+1}C_k^{\frac {i+1} 2 }A_i\)且\(i\equiv1\pmod 2\)
偶数可以暴力转换为奇数,最终预处理之后就可以 \(O(n)\)完成。
打表找规律是信息学竞赛的一种常见手段,非常好用,建议多多使用。
证明
接下来是严谨的证明,使用数学归纳法。
打表已知前几项符合我们的假设,接下来我们假设对于长度小于等于 \(x-2\) 且为奇数的数组全部符合这一设想。
对于一个长度为\(x\)的数组,我们进行运算。
A_1-A_2,A_2-A_3,...,A_{x-1}-A_x\\
A_1-A_3,A_2-A_4,...,A_{x-2}-A_x\\
\]
由于长度小于等于 \(x-2\) 且为奇数的数组全部符合这一设想,所以设\(k=\frac {x-3} 2\),则原式可写成:
\]
那么对于一个奇数\(i\),\(A_i\)会在哪里出现呢?显然是\(C_k^{\frac {i-1} 2 } (A_i-A_{i+2})\)和 \(C_k^{\frac {i+1} 2 } (A_{i+2}-A_{i+4})\)
\(A_i\)的系数为\((-1)^{i+1}(C_k^{\frac {i-1} 2 }+C_k^{\frac {i+1} 2 } )=(-1)^{i+1}C_{k+1}^{\frac {i+1} 2 }\),由此,证明完毕。
代码
#include<bits/stdc++.h>
using namespace std;
const long long mod=1e9+7;
long long n,a[100005],inv[100005],fac[100005],ans;
long long C(long long n,long long m)
{
if(n<m)return 0;
if(n==m||m==0)return 1;
return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
long long ksm(long long x,long long y)
{
long long ans=1;
while(y)
{
if(y&1)ans=ans*x%mod;
x=x*x%mod;
y>>=1;
}
return ans;
}
int main()
{
fac[0]=1;
for(int i=1;i<=100000;i++)fac[i]=fac[i-1]*i%mod;
inv[100000]=ksm(fac[100000],mod-2);
for(int i=99999;i>=1;i--)inv[i]=inv[i+1]*(i+1)%mod;
scanf("%lld",&n);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
if(n%2==0)
{
for(int i=1;i<n;i++)a[i]=(a[i]+a[i+1])%mod;
n--;
}
long long k=(n-1)/2,t=1;
for(int i=1;i<=n;i+=2)
ans=((ans+t*C(k,(i+1)/2-1)%mod*a[i]%mod)%mod+mod)%mod;
t*=-1;
}
printf("%lld",ans);
}
2021牛客OI赛前集训营-提高组(第三场) 第二题 交替 题解与结论证明的更多相关文章
- 2020牛客NOIP赛前集训营-提高组(第三场)C-牛半仙的妹子Tree【虚树,最短路】
正题 题目链接:https://ac.nowcoder.com/acm/contest/7609/C 题目大意 给出\(n\)个点的一棵树,\(m\)个时刻各有一个操作 标记一个点,每个点被标记后的每 ...
- 牛客网NOIP赛前集训营-提高组(第一场)
牛客的这场比赛感觉真心不错!! 打得还是很过瘾的.水平也比较适合. T1:中位数: 题目描述 小N得到了一个非常神奇的序列A.这个序列长度为N,下标从1开始.A的一个子区间对应一个序列,可以由数对[l ...
- [牛客网NOIP赛前集训营-提高组(第一场)]C.保护
链接:https://www.nowcoder.com/acm/contest/172/C来源:牛客网 题目描述 C国有n个城市,城市间通过一个树形结构形成一个连通图.城市编号为1到n,其中1号城市为 ...
- 2020牛客NOIP赛前集训营-普及组(第二场)A-面试
面 试 面试 面试 题目描述 牛牛内推了好多人去牛客网参加面试,面试总共分四轮,每轮的面试官都会对面试者的发挥进行评分.评分有 A B C D 四种.如果面试者在四轮中有一次发挥被评为 D,或者两次发 ...
- 2020牛客NOIP赛前集训营-普及组(第二场) 题解
目录 T1 面试 描述 题目描述 输入描述: 输出描述: 题解 代码 T2 纸牌游戏 描述 题目描述 输入描述: 输出描述: 题解 代码 T3 涨薪 描述 题目描述 输入描述: 输出描述: 题解 代码 ...
- 比赛总结——牛客网 NOIP赛前集训营提高组模拟第一场
第一场打的很惨淡啊 t1二分+前缀最小值没想出来,20分的暴力也挂了,只有10分 t2数位dp,调了半天,结果因为忘了判0的特殊情况WA了一个点,亏死 t3emmmm.. 不会 imone说是DSU ...
- 牛客网NOIP赛前集训营-提高组(第一场)B 数数字
数数字 思路: 数位dp 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include< ...
- 牛客网NOIP赛前集训营-提高组(第一场)A 中位数
中位数 思路: 二分答案 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include< ...
- 牛客网NOIP赛前集训营 提高组 第5场 T2 旅游
[题解] 我们可以发现不在最小生成树上的边一定不能多次经过,因为一条不在最小生成树上的边(u,v)的边权比最小生成树上(u,v)之间的路径更长,选择不在最小生成树上的边一定不划算. 我们还需要确定最小 ...
- NOIP赛前集训营-提高组(第一场)#B 数数字
题目描述 小N对于数字的大小一直都有两种看法.第一种看法是,使用字典序的大小(也就是我们常用的判断数字大小的方法,假如比较的数字长度不同,则在较短一个前面补齐前导0,再比较字典序),比如43<3 ...
随机推荐
- ggplot2: display every nth value on discrete axis
every_nth = function(n) { return(function(x) {x[c(TRUE, rep(FALSE, n - 1))]}) } ggplot(mpg, aes(x = ...
- jmeter学习-性能指标、jmeter初识
一:性能测试的指标 1. 并发/并发数/并发用户数 狭义的并发:同一时间做相同的一件事 广义的并发:同一时间做不同事情,混合场景,对服务器来说的并发 性能测试,先做简单的狭义并发,在做广义并发:先做单 ...
- 在Vue的mixins(混入)里面调用Vuex(@/store/index.js)的函数
第一步:在mixin.js里面引入 mapMutations 第二步:跟组件内调用一样,在methods里面写 "...mapMutations(['xxx'])", 然后LZ ...
- java并发编程实践-线程安全性
线程是CPU资源调度的基本单位,如果一个程序中只有一个线程,则最多只能在一个处理器上运行,如果电脑/服务器是双处理器系统,则单线程的程序只能使用一半的CPU资源,所以,多线程是提高处理器资源利用率的重 ...
- Linux0.11源码学习(四)
Linux0.11源码学习(四) linux0.11源码学习笔记 参考资料: https://github.com/sunym1993/flash-linux0.11-talk https://git ...
- webpack原理(1):Webpack热更新实现原理代码分析
热更新,主要就是把前端工程 文件变更,即时编译,然后通知到浏览器端,刷新代码. 服务单与客户端通信方式有:ajax 轮询,EventSource.websockt. 客户端刷新一般分为两种: 整体页面 ...
- 使用golang+antlr4构建一个自己的语言解析器(一)
Antlr4 简介 ANTLR(全名:ANother Tool for Language Recognition)是基于LL(*)算法实现的语法解析器生成器(parser generator),用Ja ...
- freeswitch媒体协商的优先级方案
概述 freeswitch是一款简单好用的VOIP开源软交换平台. 不同的媒体格式各有优缺点,实际环境中的应用要根据线路和客户的实际需求确定. 本文中介绍一种较为通用的媒体配置方案,可以适配大部分场景 ...
- buuctf-RE-SimpleRev
IDA 打开 将main函数反编译为C代码 1 int __cdecl __noreturn main(int argc, const char **argv, const char **envp) ...
- SpringBoot进阶教程(七十五)数据脱敏
无论对于什么业务来说,用户数据信息的安全性无疑都是非常重要的.尤其是在数字经济大火背景下,数据的安全性就显得更加重要.数据脱敏可以分为两个部分,一个是DB层面,防止DB数据泄露,暴露用户信息:一个是接 ...