题解
- 显然我们可以得到这么几组方程:
- x^m-x≡0(mod p1) x^m-x≡0(mod p2) ...(以此类推)
- 然后因为每个质数不同,根据中国剩余定理,同余方程的解的个数为每个同余方程的个数的乘积和
代码
1 #include <cstdio>
2 #include <iostream>
3 #include <cstring>
4 using namespace std;
5 const int N=1e4+10;
6 int id,T,c,ans,m,p[N],f[N];
7 bool bz[N];
8 int ksm(int a,int b,int mo) { int r=1; for (;b;b>>=1,a=a*a%mo) if (b&1) r=r*a%mo; return r; }
9 int zs(int x,int y)
10 {
11 int ans=2; p[0]=0;
12 for (int i=2,t;i<x;i++)
13 {
14 if (!bz[i]) p[++p[0]]=i,f[i]=ksm(i,y,x);
15 for (int j=1;j<=p[0];j++)
16 {
17 if ((t=i*p[j])>x) break;
18 bz[t]=1,f[t]=f[i]*f[p[j]]%x;
19 if (i%p[j]==0) break;
20 }
21 ans+=f[i]==i;
22 }
23 return ans;
24 }
25 int main()
26 {
27 freopen("division.in","r",stdin),freopen("division.out","w",stdout),scanf("%d%d",&id,&T);
28 while (T--)
29 {
30 scanf("%d%d",&c,&m),ans=1;
31 for (int i=1,p;i<=c;i++) scanf("%d",&p),ans=1ll*ans*zs(p,m)%998244353;
32 printf("%d\n",ans);
33 }
34 }