HDU

来源:互联网 发布:htc windows系统手机 编辑:程序博客网 时间:2024/06/15 05:33

题目链接点这里

可以看这位大爷的题解:http://blog.csdn.net/snowy_smile/article/details/52020971

#include<bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3f#define INFLL 0x3f3f3f3f3f3f3f3f#define FIN freopen("input.txt","r",stdin)#define mem(x,y) memset(x,y,sizeof(x))typedef unsigned long long ULL;typedef long long LL;#define fuck(x) cout<<"q"<<endl;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1typedef pair<pair<int,int>,int> PIII;typedef pair<int,int> PII;const double eps=1e-6;const int MX=4e5+5;const int P=313;int n;int a[MX];const double pi = acos(-1.0);int len,mx;//开大4倍int res[MX];struct Complex{    double r,i;    Complex(double r=0,double i=0):r(r),i(i) {};    Complex operator+(const Complex &rhs)    {        return Complex(r + rhs.r,i + rhs.i);    }    Complex operator-(const Complex &rhs)    {        return Complex(r - rhs.r,i - rhs.i);    }    Complex operator*(const Complex &rhs)    {        return Complex(r*rhs.r - i*rhs.i,i*rhs.r + r*rhs.i);    }} va[MX],vb[MX];void rader(Complex F[],int len)   //len = 2^M,reverse F[i] with  F[j] j为i二进制反转{    int j = len >> 1;    for(int i = 1; i < len - 1; ++i)    {        if(i < j) swap(F[i],F[j]);  // reverse        int k = len>>1;        while(j>=k)        {            j -= k;            k >>= 1;        }        if(j < k) j += k;    }}void FFT(Complex F[],int len,int t){    rader(F,len);    for(int h=2; h<=len; h<<=1)    {        Complex wn(cos(-t*2*pi/h),sin(-t*2*pi/h));        for(int j=0; j<len; j+=h)        {            Complex E(1,0); //旋转因子            for(int k=j; k<j+h/2; ++k)            {                Complex u = F[k];                Complex v = E*F[k+h/2];                F[k] = u+v;                F[k+h/2] = u-v;                E=E*wn;            }        }    }    if(t==-1)   //IDFT        for(int i=0; i<len; ++i)            F[i].r/=len;}void Conv(Complex a[],Complex b[],int len)   //求卷积{    FFT(a,len,1);    FFT(b,len,1);    for(int i=0; i<len; ++i) a[i] = a[i]*b[i];    FFT(a,len,-1);}void cdq(int l,int r){    if(l==r)    {        res[l]=(res[l]+a[l])%P;        return ;    }    int mid=(l+r)>>1;    cdq(l,mid);    //fft    int len=1;    while(len<mid-2*l+r-1)len<<=1;    for(int i=0; i<len; i++)va[i].i=va[i].r=vb[i].i=vb[i].r=0;    for(int i=0; i+l<=mid; i++)    {        va[i].r=res[i+l];        va[i].i=0;    }    for(int i=0; i+1<=r-l; i++)    {        vb[i].r=a[i+1];        vb[i].i=0;    }    Conv(va,vb,len);    for(int i=mid+1; i<=r; i++)        res[i]=(res[i]+(int)(va[i-1-l].r+0.5))%P;    cdq(mid+1,r);}int main(){    FIN;    while(cin>>n&&n)    {        for(int i=1; i<=n; i++)res[i]=0;        for(int i=1; i<=n; i++)        {            scanf("%d",&a[i]);            a[i]%=P;        }        cdq(1,n);        cout<<res[n]<<endl;    }    return 0;}


原创粉丝点击