链接
题解
F ( n ) = 1 − a n 1 − a F(n)=\frac{1-a^n}{1-a} F(n)=1−a1−an
构造生成函数
(
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;
}