三模NNT,只有50分,是常数的问题吗?
#pragma GCC optimize(2)
#include <cstdio>
#include <iostream>
#include <cmath>
#define int long long
using namespace std;
const int MAXN = 1000005;
int read()
{
int num=0,flag=1;char c;
while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;
while(c>='0'&&c<='9')num=(num<<3)+(num<<1)+(c^48),c=getchar();
return num*flag;
}
int n,p,lg,cnt,len,a[MAXN],b[MAXN],c[MAXN],Rev[MAXN],ans[MAXN][4];
int p1=469762049,p2=998244353,p3=1004535809,A[MAXN],B[MAXN],C[MAXN],D[MAXN];
int qkpow(int a,int b,int mod)
{
int res=1;
while(b>0)
{
if(b&1) res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
int exgcd(int a,int b,int &x,int &y)
{
if(b==0){x=1;y=0;return a;}
int d=exgcd(b,a%b,y,x);
y-=(a/b)*x;
return d;
}
void NTT(int *a,const int len,int tmp,int MOD)
{
for(int i=0;i<len;i++)
{
Rev[i]=(Rev[i>>1]>>1)|((i&1)<<(lg-1));
if(i<Rev[i])
swap(a[i],a[Rev[i]]);
}
for(int s=2;s<=len;s<<=1)
{
int t=s/2,w=(tmp==1)?qkpow(3,(MOD-1)/s,MOD):qkpow(3,(MOD-1)-(MOD-1)/s,MOD);
for(int i=0;i<len;i+=s)
{
int x=1;
for(int j=0;j<t;j++,x=x*w%MOD)
{
int fe=a[i+j],fo=a[i+j+t];
a[i+j]=(fe+x*fo)%MOD;
a[i+j+t]=((fe-fo*x)%MOD+MOD)%MOD;
}
}
}
if(tmp==1) return ;
int inv=qkpow(len,MOD-2,MOD);
for(int i=0;i<len;i++)
a[i]=a[i]*inv%MOD;
}
void fuck(int *a,int *b,int p,int id)
{
len=lg=1;while(len<=2*n) len<<=1,lg++;
lg--;
for(int i=0;i<len;i++) A[i]=B[i]=0;
for(int i=0;i<n;i++) A[i]=a[i];
for(int i=0;i<n;i++) B[i]=b[i];
NTT(A,len,1,p);NTT(B,len,1,p);
for(int i=0;i<len;i++) A[i]=A[i]*B[i]%p;
NTT(A,len,-1,p);
for(int i=0;i<2*n;i++)
ans[i][id]=A[i];
}
int excrt(int a,int b)
{
int m[3]={0,p1,p2},r[3]={0,a,b};
int M=m[1],R=r[1],x=0,y=0;
for(int i=2;i<=2;i++)
{
int d=exgcd(M,m[i],x,y);
if((R-r[i])%d) return -1;
x=x*(R-r[i])/d%m[i];
R-=x*M;
M=M*m[i]/d;
R%=M;
}
return (R%M+M)%M;
}
void mul(int n,int *a,int *b,int *c)
{
fuck(a,b,p1,1);
fuck(a,b,p2,2);
fuck(a,b,p3,3);
for(int i=0;i<2*n;i++)
{
int x=excrt(ans[i][1],ans[i][2]);
int y=(ans[i][3]-x)%p3*qkpow(p1,p3-2,p3)%p3*qkpow(p2,p3-2,p3)%p3;
y=(y%p3+p3)%p3;
c[i]=((y*p1%p*p2%p+x)%p+p)%p;
}
}
void work(int n,int *a,int *b)
{
mul(n,b,b,c);
mul(n,a,c,c);
for(int i=0;i<n;i++)
b[i]=((2*b[i]-c[i])%p+p)%p;
}
void inv(int n,int *a,int *b)
{
int cur=1;
for(int i=0;i<n;i++) b[i]=0;
b[0]=qkpow(a[0],p-2,p);
while(cur<n)
{
cur<<=1;
work(cur,a,b);
}
}
void ln(int n,int *a,int *b)
{
for(int i=0;i<n;i++)
C[i]=a[i];
inv(n,C,D);
for(int i=0;i<n;i++)
C[i]=C[i+1]*(i+1)%p;
mul(n,C,D,C);
b[0]=0;
for(int i=1;i<n;i++)
b[i]=C[i-1]*qkpow(i,p-2,p)%p;
}
signed main()
{
n=read();p=read();
a[0]=1;
for(int i=1;i<=n;i++)
a[i]=read();
ln(n+1,a,b);
for(int i=1;i<=n;i++)
b[i]=i*b[i]%p;
for(int i=1;i<=n;i++)
for(int j=i+i;j<=n;j+=i)
b[j]=((b[j]-b[i])%p+p)%p;
for(int i=1;i<=n;i++)
if(b[i])
cnt++;
printf("%lld\n",cnt);
for(int i=1;i<=n;i++)
if(b[i])
printf("%lld ",i);
}