E. Missing Numbers

题目链接:https://codeforces.com/contest/1081/problem/E

题意:

现在有n个数(n为偶数),但只给出a2,a4....an的信息,要求你求出a1,a2....an。

假设前n项的和为Sn,那么满足S1,S2....Sn都为平方项。

题解:

假设S1=a^2,S2=b^2,S3=c^2,S4=d^2,因为我们已知a2,a4,所以得出a2=S2-S1=b^2-a^2,a4=d^2-c^2。

我们可以根据我们设的未知数推出a1=a^2,a3=c^2-b^2。

最后我们将这个推广可以推出a1,a3....an-1的表达式可以根据a0,a2...an得出,这里我们令a0=0。

现在的任务就是找每个数的因子,因为b^2-a^2=(b+a)*(b-a)。这里我们直接预处理一下就好了~

然后我们维护一下之前那个数的b^2(较大平方项),在找当前这个数的c^2(较小平方项),根据这个相减就可以求出他们中间的ai了~

代码如下:

#include <bits/stdc++.h>
#define mx 2e5
using namespace std;
typedef long long ll;
const int N =2e5+;
ll a[N];
int n;
vector <int> Div[N];
int main(){
cin>>n;
for(int i=;i<=n;i+=) scanf("%I64d",&a[i]);
for(int i=;i<=mx;i++)
for(int j=i;j<=mx;j+=i) Div[j].push_back(i); //nlogn预处理
ll last = ;
for(int i=;i<=n;i+=){
ll mn=2e18;
for(auto v:Div[a[i]]){
int d=a[i]/v;
if(d%==v%){
ll now = (max(d,v)-min(d,v))/;
if(now*now>last)
mn = min(mn,now*now);
}
}
if(mn==2e18){
puts("No");return ;
}
a[i-]=mn-last;
last = a[i]+mn;
}
puts("Yes");
for(int i=;i<=n;i++){
printf("%I64d ",a[i]);
}
return ;
}

最新文章

  1. SQL2005 : 如何在SQL Server Profiler (事件查看器)中 跟踪查看死锁恢复
  2. CSS盒子模型学习记录2
  3. Linear or non-linear shadow maps?
  4. Linux中date命令的各种实用方法--转载
  5. JDK、JRE和JVM的区别与联系
  6. iOS在MRC工程环境下下使用ARC的方法
  7. 推荐系统相关算法:SVD
  8. 关于PHP单双引号解析变量的问题
  9. spark shuffle
  10. Firefox 的兼容问题
  11. GitHub 常用的几条命令
  12. ubantu中安装TensorFlow遇到的问题
  13. 整理六百篇web前端知识混总
  14. JSP显示页面和数据库乱码
  15. delphi 字符串string转流TStream
  16. 【API】API函数创建用户,添加到管理组
  17. django的url配置
  18. phpStudy-坑爹的数据库管理器-phpMyAdmin的默认用户名和密码
  19. ios 从工程中删除Cocoapods
  20. 悟空模式-java设计模式

热门文章

  1. IntelliJ IDEA 12 创建Web项目 教程 超详细版【转】
  2. php学习【1】
  3. 微信小程序本地缓存
  4. 小白对异步IO的理解
  5. MVN settings.xml
  6. MyBatis---自动创建表
  7. Vbs 测试程序二
  8. CodeIgniter学习笔记二:CI中的query_builder(AR)、连贯操作
  9. 【Kernal Support Vector Machine】林轩田机器学习技术
  10. Python 3基础教程8--if else、if elif else