[线性筛][中国剩余定理][同余方程] Jzoj P6272 整除
题解
- 显然我们可以得到这么几组方程:
- 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 }