2019南昌网络赛D.Interesting Series

链接

点击跳转

题解

F ( n ) = 1 − a n 1 − a F(n)=\frac{1-a^n}{1-a} F(n)=1a1an

构造生成函数
( 1 + a s 1 x ) ( 1 + a s 2 x ) . . . ( 1 + a s n x ) (1+a^{s_1}x)(1+a^{s_2}x)...(1+a^{s_n}x) (1+as1x)(1+as2x)...(1+asnx)

每次查询第 k k k项的系数即可

代码

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define iinf 0x3f3f3f3f
#define linf (1ll<<60)
#define eps 1e-8
#define maxn 1000010
#define p 100003ll
#define cl(x) memset(x,0,sizeof(x))
#define rep(_,__) for(_=1;_<=(__);_++)
#define em(x) emplace(x)
#define emb(x) emplace_back(x)
#define emf(x) emplace_front(x)
#define fi first
#define se second
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef complex<double> C;
ll read(ll x=0)
{
    ll c, f(1);
    for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;
    for(;isdigit(c);c=getchar())x=x*10+c-0x30;
    return f*x;
}
struct EasyMath
{
    ll prime[maxn];
    bool mark[maxn];
    ll fastpow(ll a, ll b, ll c)
    {
        ll t(a%c), ans(1ll);
        for(;b;b>>=1,t=t*t%c)if(b&1)ans=ans*t%c;
        return ans;
    }
    void get_prime(ll N)
    {
        ll i, j;
        for(i=2;i<=N;i++)mark[i]=false;
        *prime=0;
        for(i=2;i<=N;i++)
        {
            if(!mark[i])prime[++*prime]=i;
            for(j=1;j<=*prime and i*prime[j]<=N;j++)
            {
                mark[i*prime[j]]=true;
                if(i%prime[j]==0)break;
            }
        }
    }
}em;
struct FFT {
	int n, m, rev[maxn];
    const double pi=acos(-1);
    typedef complex<double> C;
	C a[maxn], b[maxn];
	void init(int len) {
		for(n = 1, m = 0; n <= len; n <<= 1, m++);
		for(int i = 0; i < n; ++i) {
			rev[i] = rev[i >> 1] >> 1 | (i & 1) << (m - 1);
			a[i] = C(0, 0);
			b[i] = C(0, 0);
		}
	}
	void fft(C *a, int f) {
		for(int i=0;i<n;i++)if(i<rev[i])swap(a[i], a[rev[i]]);
		for(int i=1;i<n;i<<=1)
        {
			double alpha=pi/i;
			if (f==-1)alpha=-pi/i;
			for(int k=0;k<i;k++)
            {
				C w=exp(C(0,alpha*k));
				for(int j=k;j<n;j+=(i<<1))
                {
					C x=w*a[j+i];
					a[j+i]=a[j]-x;
					a[j]+=x;
				}
			}
		}
        if(f==-1)for(int i=0;i<n;i++)a[i]/=n;
	}
	void run()
    {
		fft(a,1); fft(b,1);
		for(int i=0;i<n;i++)a[i]*=b[i];
		fft(a,-1);
	}
}fft;
ll fact[maxn], s[maxn];
ll* solve(ll l, ll r)
{
    ll *ans=(ll*)malloc(sizeof(ll)*(r-l+2)), i, mid(l+r>>1);
    if(l==r){ans[0]=1, ans[1]=s[l]; return ans;}
    auto p1=solve(l,mid), p2=solve(mid+1,r);
    fft.init(r-l+1);
    for(i=0;i<fft.n;i++)fft.a[i]=fft.b[i]=C(0,0);
    for(i=0;i<=mid-l+1;i++)fft.a[i]=C(p1[i],0);
    for(i=0;i<=r-mid;i++)fft.b[i]=C(p2[i],0);
    fft.run();
    for(i=0;i<=r-l+1;i++)ans[i]=ll(fft.a[i].real()+0.5)%p;
    return ans;
}
int main()
{
    ll i, N, A, Q;
    N=read(), A=read(), Q=read();
    for(i=0;i<N;i++)s[i]=em.fastpow(A,read(),p);
    fact[0]=1;
    for(i=1;i<=N;i++)fact[i]=fact[i-1]*i%p;
    auto *a=solve(0,N-1);
    ll kase=0;
    while(Q--)
    {
        ll k=read();
        ll ans=fact[N]*em.fastpow(fact[k],p-2,p)%p*em.fastpow(fact[N-k],p-2,p)%p;
        (ans-=a[k])%=p;
        (ans*=em.fastpow(1-A,p-2,p))%=p;
        printf("%lld\n",(ans+p)%p);
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值