bzoj 4929: 第三题

Description

给定n,b,c,d,e以及A0,A1,···,An−1,定义

xk=b×c^4k+d×c^2k+e

f(x)=Sigma(Aix^i),0<=i<=n-1

请你求出f(x0),f(x1),···,f(xn−1)对10^6+3取模的值。

Input

第一行包括五个整数n,b,c,d,e。

接下来一行包括n个整数,代表a0,a1,···,an−1

N<=60000,保证给出的数字都为整数且均在 [0, 10^6]

Output

N行,第i行代表f(xi−1)

多项式多点求值可过,但似乎不是正解

#include<bits/stdc++.h>
typedef std::vector<int> pol;
typedef long long i64;
typedef unsigned long long u64;
const int P=1000003;
int max(int a,int b){return a>b?a:b;}
template<int p>
i64 pw(int a,int n){
    if(n<0)n+=p-1;
    i64 v=1;
    for(;n;n>>=1,a=i64(a)*a%p)if(n&1)v=v*a%p;
    return v;
}
int N,K,r[1<<20|111];
typedef double ld;
struct cplx{
    ld a,b;
    cplx(ld _x=0,ld _y=0):a(_x),b(_y){}
    cplx operator+(cplx w){return cplx(a+w.a,b+w.b);}
    cplx operator-(cplx w){return cplx(a-w.a,b-w.b);}
    cplx operator*(cplx w){return cplx(a*w.a-b*w.b,a*w.b+b*w.a);}
}A[1<<20|111],B[1<<20|111],*Es[2][20],C[1<<20|111],D[1<<20|111];
void pre(int n){
    for(N=2,K=0;N<n;N<<=1,++K);
    for(int i=1;i<N;++i)r[i]=r[i>>1]>>1|(i&1)<<K;
    memset(A,0,sizeof(cplx)*N);
    memset(B,0,sizeof(cplx)*N);
    memset(C,0,sizeof(cplx)*N);
    memset(D,0,sizeof(cplx)*N);
}
const ld pi=acos(-1);
void dft(cplx*a,int t){
    for(int i=1;i<N;++i)if(i<r[i])std::swap(a[i],a[r[i]]);
    for(int i=1,z=0;i<N;i<<=1,++z){
        if(!Es[t==1][z]){
            cplx*E=Es[t==1][z]=new cplx[i];
            for(int j=0;j<i;++j)E[j]=cplx(cos(j*pi/i),t*sin(j*pi/i));
        }
        cplx*E=Es[t==1][z];
        for(int j=0;j<N;j+=i<<1){
            cplx*b=a+j,*c=b+i;
            for(int k=0;k<i;++k){
                cplx x=b[k],y=c[k]*E[k];
                b[k]=x+y;
                c[k]=x-y;
            }
        }
    }
    if(t==-1)for(int i=0;i<N;++i)a[i].a/=N;
}
void mul(cplx*a,cplx*b){
    for(int i=0;i<N;++i)a[i]=a[i]*b[i];
}
void mov(const pol&x,cplx*a){
    for(int i=0;i<x.size();++i)a[i].a=x[i];
}
void mov(cplx*a,const pol&_x){
    pol&x=const_cast<pol&>(_x);
    for(int i=0;i<x.size();++i)x[i]=i64(a[i].a+0.49)%P;
}
void mov(const pol&x,int*a){
    memcpy(a,x.data(),x.size()*sizeof(int));
}
void mov(int*a,const pol&_x){
    pol&x=const_cast<pol&>(_x);
    memcpy(x.data(),a,x.size()*sizeof(int));
}
void chk(pol&w){
    int p=w.size();
    while(p&&!w[p-1])--p;
    w.resize(p);
}
void rev(pol&w){
    std::reverse(w.data(),w.data()+w.size());
}
u64 _c[1007];
pol operator*(const pol&a,const pol&b){
    pol c(a.size()+b.size()-1);
    if(c.size()<=600){
        const int*as=a.data(),ap=a.size(),*bs=b.data(),bp=b.size();
        int*cs=c.data();
        for(int i=0;i<c.size();++i)_c[i]=0;
        for(int i=0;i<ap;++i)for(int j=0;j<bp;++j)_c[i+j]+=u64(as[i])*bs[j];
        for(int i=0;i<c.size();++i)cs[i]=_c[i]%P;
    }else if(c.size()<=5000){
        pre(c.size());
        mov(a,A),mov(b,B);
        dft(A,1),dft(B,1);
        mul(A,B);
        dft(A,-1);
        mov(A,c);
    }else{
        pre(c.size());
        for(int i=0;i<a.size();++i){
            A[i]=a[i]>>10;
            B[i]=a[i]&1023;
        }
        for(int i=0;i<b.size();++i){
            C[i]=b[i]>>10;
            D[i]=b[i]&1023;
        }
        dft(A,1);dft(B,1);dft(C,1);dft(D,1);
        for(int i=0;i<N;++i){
            cplx v1=A[i]*C[i];
            cplx v2=A[i]*D[i]+B[i]*C[i];
            cplx v3=B[i]*D[i];
            A[i]=v1;
            B[i]=v2;
            C[i]=v3;
        }
        dft(A,-1);dft(B,-1);dft(C,-1);
        for(int i=0;i<c.size();++i){
            c[i]=((i64(A[i].a+0.49)<<20)+(i64(B[i].a+0.49)<<10)+i64(C[i].a+0.49))%P;
        }
    }
    chk(c);
    return c;
}
pol operator*(const pol&w,int x){
    pol a(w);
    for(int i=0;i<a.size();++i)a[i]=i64(a[i])*x%P;
    return a;
}
pol operator-(const pol&a,const pol&b){
    pol c(max(a.size(),b.size()));
    mov(a,c.data());
    for(int i=0;i<b.size();++i)c[i]=(c[i]-b[i]+P)%P;
    chk(c);
    return c;
}
pol inv(pol a){
    if(a.size()==1){
        a.resize(1);
        a[0]=pw<P>(a[0],P-2);
        return a;
    }
    pol b=inv(pol(a.data(),a.data()+(a.size()-1)/2+1));
    pol c=b*b*a;
    c=b*2-c;
    c.resize(a.size());
    return c;
}
pol operator/(pol a,pol b){
    chk(a),chk(b);
    rev(a),rev(b);
    int sz=a.size()-b.size()+1;
    b.resize(sz);
    pol c=a*inv(b);
    c.resize(sz);
    rev(c);
    chk(c);
    return c;
}
pol operator%(const pol&a,const pol&b){
    if(a.size()<b.size())return a;
    return a-a/b*b;
}
int cal(const pol&w,i64 x){
    int y=0;
    for(int p=w.size()-1;p>=0;--p)y=(y*x+w[p])%P;
    return y;
}
int n,b,c,d,e,a[67777],as[67777];
struct Q{int x,id;}qs[67777];
bool operator<(Q a,Q b){return a.x<b.x;}
pol tr[133333];
void calc0(int w,int L,int R){
    if(L==R){
        tr[w]=pol(2);
        tr[w][1]=1;
        tr[w][0]=(P-qs[L].x)%P;
        return;
    }
    int M=(L+R)/2;
    calc0(w<<1,L,M);
    calc0(w<<1^1,M+1,R);
    tr[w]=tr[w<<1]*tr[w<<1^1];
}
void calc1(const pol&a,int w,int L,int R){
    if(R-L<=600){
        for(int i=L;i<=R;++i)as[qs[i].id]=cal(a,qs[i].x);
        return;
    }
    int M=(L+R)/2;
    calc1(a%tr[w<<1],w<<1,L,M);
    calc1(a%tr[w<<1^1],w<<1^1,M+1,R);
}
int main(){
    scanf("%d%d%d%d%d",&n,&b,&c,&d,&e);
    for(int i=0;i<n;++i)scanf("%d",a+i);
    for(int i=0;i<n;++i){
        qs[i].x=(b*pw<P>(c,4*i)+d*pw<P>(c,2*i)+e)%P;
        qs[i].id=i;
    }
    std::sort(qs,qs+n);
    tr[0]=pol(n);
    mov(a,tr[0]);
    calc0(1,0,n-1);
    calc1(tr[0],1,0,n-1);
    for(int i=0;i<n;++i)printf("%d\n",(as[i]+P)%P);
    return 0;
}
时间: 2024-11-07 01:52:09

bzoj 4929: 第三题的相关文章

树套树三题 题解

1.COGS 1534 [NEERC 2004]K小数 其实是主席树裸题…… (其实这题数据非常水……从O(nlogn)的主席树到O(nlog3n)的树套树+二分到O(nsqrt(n)log2n)的分块套二分套二分到O(n2)的暴力都能过……) 鉴于这就是动态排名系统的静态版,就不说了,贴代码: 线段树套平衡树: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; con

2014马哥Linux0217中对0214三题的解答

前几天在做2014马哥Linux0214的作业的时候,发现其实这三题在0217中有解答,当然觉得马哥比自己写得好太多,所以忍不住要把马哥的答案贴出来,以供自己学习. 第一题:写一个脚本,用for循环实现显示/etc/init.d/functions./etc/rc.d/rc.sysinit./etc/fstab有多少行 #!/bin/bash for fileName in /etc/init.d/functions /etc/rc.d/rc.sysinit /etc/fstab;do line

2016/1/12 第一题 输出 i 出现次数 第二题 用for循环和if条件句去除字符串中空格 第三题不用endwith 实现尾端字符查询

1 import java.util.Scanner; 2 3 4 public class Number { 5 6 private static Object i; 7 8 /* 9 *第一题 mingrikejijavabu中字符“i” 出现了几次,并将结果输出*/ 10 public static void main(String[] args) { 11 12 String r ="imingrikejijavabi"; 13 14 15 //第一种 截取 16 int a=

BZOJ第一页刷题计划

BZOJ第一页刷题计划 已完成:1 / 100 BZOJ1000:A+B

LeetCode 第三题,Longest Substring Without Repeating Characters

题目: Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest s

Java-集合-第三题 有如下Student 对象, private String name; private int age; private int score; private String classNum; 其中,classNum 表示学生的班号,例如“class05”。 有如下List List list = new ArrayList(); l

第三题 有如下Student 对象, private String name; private int age; private int score; private String classNum; 其中,classNum 表示学生的班号,例如“class05”. 有如下List List list = new ArrayList(); list.add(new Student(“Tom”, 18, 100, “class05”)); list.add(new Student(“Jerry”,

NOIP2005-普及组复赛-第三题-采药

题目描述 Description 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值.我会给你一段时间,在这段时间里,你可以采到一些草药.如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大.” 如果你是辰辰,你能完成这个任务吗? 输入输出格式 Input/output 输入格式:输

2014百度之星资格赛第三题

Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total Submission(s): 7837    Accepted Submission(s): 3350 Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Z

第二题、第三题、第四题

1.以编程方式操作 HttpCachePolicy 类. HttpCachePolicy.SetExpires HttpCachePolicy.SetCacheability |NoCache|Private|Public|Server|ServerAndNoCache |ServerAndPrivate 2<%@ OutputCache Duration="60" VaryByParam="None" %>Duration 和 VaryByParam