社区讨论
震惊!一道NTT与FFT都无法通过的神奇题目!
P3723[AHOI2017/HNOI2017] 礼物参与者 5已保存回复 8
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 8 条
- 当前快照
- 1 份
- 快照标识符
- @mi5hzssa
- 此快照首次捕获于
- 2025/11/19 12:24 4 个月前
- 此快照最后确认于
- 2025/11/19 12:24 4 个月前
原本FFT以为是精度问题跪了,结果强行补学了一发NTT,还是跪,答案都一模一样。。数据有误?QwQ
CPP#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define N 200005
typedef long long LL;
const LL P=998244353;
const LL g=3;
using namespace std;
LL n,m,i,j,k,p,q,nq,len,cnt,rev[N],x[N],y[N],wn[N],X;
LL a[N],b[N],c[N],A[N],B[N],C[N];
LL mi(LL a,LL t,LL mo)
{
if (t==0) return 1;
if (t==1) return a;
LL d=mi(a,t/2,mo);
if (t&1) return a*d%mo*d%mo;
else return d*d%mo;
}
void dft(LL a[],LL A[],LL on)//a->A, on==1; A->a, on==-1;
{
LL i,j,k,id=0,w,x,y;
for (i=0; i<len; i++) A[i]=a[rev[i]];
for (k=2; k<=len; k*=2)
{
id++;
for (i=0; i<len; i+=k)
{
w=1;
for (j=i; j<i+k/2; j++)
{
x=A[j],y=w*A[j+k/2]%P;
A[j]=(x+y)%P; A[j+k/2]=(x-y+P)%P;
w=w*wn[id]%P;
}
}
}
if (on==-1)
{
for (i=1; i<len/2; i++) swap(A[i],A[len-i]);
LL inv=mi(len,P-2,P);
for (i=0; i<len; i++) A[i]=A[i]%P*inv%P;
}
}
int main()
{
cin>>n>>m;
for (i=1; i<=n; i++) {cin>>x[i];p+=x[i];q+=x[i]*x[i];}
for (i=1; i<=n; i++) {cin>>y[i];p-=y[i];q+=y[i]*y[i];}
p*=2;//G=nc^2+pc+q;
for (i=0; i<n; i++) a[i]=a[i+n]=x[n-i],b[i]=y[i+1];
for (len=1,k=0; len<n*2; len*=2,k++);
for (i=0; i<len; i++)
{
j=i; rev[i]=0;
for (long d=0; d<k; d++) rev[i]+=(1<<(k-d-1))*(j&1),j>>=1;
}
for (i=0; i<20; i++) wn[i]=mi(g,(P-1)/(1<<i),P);
dft(a,A,1); dft(b,B,1);
for (i=0; i<len; i++) C[i]=A[i]*B[i]%P;
dft(C,c,-1);
//for (i=n; i<n*2; i++) cout<<long(c[i].r)<<' ';system("pause");
nq=0;
for (i=n; i<n*2; i++) nq=max(nq,c[i]);
q-=2*nq;
X=-p/(2*n);
cout<<n*X*X+p*X+q;
}
回复
共 8 条回复,欢迎继续交流。
正在加载回复...