社区讨论

震惊!一道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 条回复,欢迎继续交流。

正在加载回复...