[线性筛][中国剩余定理][同余方程] Jzoj P6272 整除

Description

Input

Output

Sample Input

0
1
2 3
2 3

Sample Output

6

Data Constraint

 

 

题解

  • 显然我们可以得到这么几组方程:
  • 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 }

 

posted @ 2019-08-06 11:13  BEYang_Z  阅读(229)  评论(0编辑  收藏  举报