博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2018.11.16 bzoj4827: [Hnoi2017]礼物(ntt)
阅读量:4963 次
发布时间:2019-06-12

本文共 1499 字,大约阅读时间需要 4 分钟。

nttnttntt 入门题。
考虑展开要求的式子∑i=0n−1(xi−yi−c)2\sum_{i=0}^{n-1}(x_i-y_i-c)^2i=0n1(xiyic)2
=>∑i=0n−1(xi2+yi2+c2−2c(xi−yi)−2xiyi)\sum_{i=0}^{n-1}(x_i^2+y_i^2+c^2-2c(x_i-y_i)-2x_iy_i)i=0n1(xi2+yi2+c22c(xiyi)2xiyi)
sum=∑i=0n−1xi−yisum=\sum_{i=0}^{n-1}x_i-y_isum=i=0n1xiyi
=>(∑i=0n−1(xi2+yi2))+min⁡{nc2−2sum∗c}−2∗max⁡{∑i=0n−1xiyi}(\sum_{i=0}^{n-1}(x_i^2+y_i^2))+\min\{nc^2-2sum*c\}-2*\max\{ \sum_{i=0}^{n-1}x_iy_i\}(i=0n1(xi2+yi2))+min{
nc2
2sumc}2max{
i=0n1xiyi}
化到这一步的时候我卡了一下。
考虑第一坨可以直接算,第二坨可以取二次函数对称轴附近求极值。
关键在于第三坨的极值。
这个怎么求呢?
考虑将bbb数组翻转。
这样对a,ba,ba,b进行nttnttntt,然后得到的新数列{zn}\{z_n\}{
zn}
中的zi+zn+iz_i+z_{n+i}zi+zn+i就对应着数列an,bna_n,b_nan,bn的一种对齐方法的和。
因此只需要在nttnttntt之后给zi+zn+iz_i+z_{n+i}zi+zn+i取个max⁡\maxmax就行了。
代码:

#include
using namespace std;inline int read(){
int ans=0; char ch=getchar(); while(!isdigit(ch))ch=getchar(); while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar(); return ans;}typedef long long ll;const int mod=998244353,N=2e5+5;int n,m,a[N],b[N],pos[N],ans=0,lim=1,tim=0,mx=0,sum=0;inline int ksm(int a,int p){
int ret=1;for(;p;p>>=1,a=(ll)a*a%mod)if(p&1)ret=(ll)ret*a%mod;return ret;}inline void ntt(int a[],int type){
for(int i=0;i
>1,typ=type==1?3:(mod+1)/3; for(int wn,mid=1;mid
<<=1,mult>>=1){
wn=ksm(typ,mult); for(int len=mid<<1,j=0;j
>1]>>1)|((i&1)<<(tim-1)); ntt(a,1),ntt(b,1); for(int i=0;i

转载于:https://www.cnblogs.com/ldxcaicai/p/10084724.html

你可能感兴趣的文章
[ExtJS5学习笔记]第十三节 Extjs5的Ext.each方法学习
查看>>
UVA 110020 Efficient Solutions (STL)
查看>>
40 Java语言基础数组的初始化之静态初始化及内存图
查看>>
IOS:UI设计之UILable相关基础
查看>>
winform中的时间轴控件
查看>>
PHP-PHP.INI常用配置详解
查看>>
Linux-系统负载
查看>>
团队Alpha冲刺(九)
查看>>
VLC播放RTSP视频延迟问题 (转)
查看>>
Array K-Coloring - codeforce
查看>>
普通用户开启AUTOTRACE 功能
查看>>
数字信号处理 之线性时不变系统
查看>>
tkinter中text文本与scroll滚动条控件(五)
查看>>
创建元素节点
查看>>
音频格式RAW和PCM区别和联系
查看>>
Cookie、Session和自定义分页
查看>>
cocos2d-x场景间参数传递
查看>>
一个误解: 单个服务器程序可承受最大连接数“理论”上是“65535”
查看>>
58笔部分试题--前端
查看>>
Storm基本原理概念及基本使用
查看>>