最小化
同时增大亮度是没有意义的,可以转化为增大一个数组的亮度,设增大了数组亮度
假设增加的亮度一定,变化的就只有最后一项,也就是最大化
但是每一种对齐方式都需要计算形如
的式子
这部分已经是的了
但是如果把数组复制一份在最后面是一个长度
的序列
把数组反转,做卷积得到的
项中有
模拟一下的情况
数组和
卷积
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 2e6+10;
const int mod = 998244353,G=3,Gi=(mod+1)/3;
int n,m,r[maxn],a[maxn],b[maxn];
int quick(int x,int n)
{
int ans = 1;
for( ; n ; n>>=1,x=x*x%mod )
if( n&1 ) ans = ans*x%mod;
return ans;
}
void init(int limit)
{
for(int i=0;i<limit;i++) r[i] = ( r[i>>1]>>1 ) | ( (i&1)?limit>>1:0 );
}
void NTT(int *a,int limit,int type )
{
for(int i=0;i<limit;i++)
if( i<r[i] ) swap( a[i],a[r[i]] );
for(int mid=1;mid<limit;mid<<=1 )
{
int wn = quick( (type==1)?G:Gi,(mod-1)/(mid<<1));
for(int R=mid<<1,i=0;i<limit;i+=R)
for(int w=1,k=0;k<mid;k++,w=w*wn%mod )
{
int x = a[i+k], y = a[i+k+mid]*w%mod;
a[i+k] = (x+y)%mod, a[i+k+mid] = (x-y+mod)%mod;
}
}
if( type==1 ) return;
int inv = quick(limit,mod-2);
for(int i=0;i<limit;i++) a[i] = a[i]*inv%mod;
}
void mul(int *a,int *b,int n,int m)
{
int limit = 1;
while( limit<=n+m ) limit<<=1;
init(limit);
for(int i=0;i<limit;i++)
{
if( i>n ) a[i] = 0;
if( i>m ) b[i] = 0;
}
NTT(a,limit,1); NTT(b,limit,1);
for(int i=0;i<limit;i++) a[i] = a[i]*b[i]%mod;
NTT(a,limit,-1);
}
int prea,preb,ajb,ans=1e9;
signed main()
{
cin >> n >> m;
for(int i=1;i<=n;i++)
{
cin >> a[i];
a[i+n] = a[i];
}
for(int i=1;i<=n;i++) { cin >> b[i]; }
for(int i=1;i<=n;i++)
prea+=a[i]*a[i],preb+=b[i]*b[i],ajb+=a[i]-b[i];
for(int l=1,r=n;r>=l;r--,l++) swap( b[l],b[r] );
mul(a,b,2*n,n);
for(int i=-100;i<=100;i++)//给i加上这么多
for(int j=n+1;j<=2*n;j++)
ans = min( ans,prea+preb+ajb*2*i+n*i*i-2*a[j] );
cout << ans;
} 
京公网安备 11010502036488号