/* 题意:给定D,用D的因子构造一张图 因子u,v之间有边:u/v是质数,边权是 u的因子数-v的因子数, 路径长度=边权之和 给定 u,v,求u,v之间最短路径的条数 怎么确定最短路径 u->v,每步等价于u乘以一个质数或除以一个质因子,这条最短路肯定经过gcd(u,v) 那么原问题转化为 u->gcd(u,v)的路径条数*gcd(u,v)->v的最短路径条数 怎么求u->gcd(u,v)的最短路径数量? u必须把多出来的那部分质因子给去掉 结论:不管按什么方式去掉质因子,最后的路径长度是不会变的(我也不知道为什么会有这个结论..看规律是这样的) 所以问题转化为有多少种去掉质因子的方式:就是个全排列 */ #include<bits/stdc++.h> using namespace std; #define ll long long #define mod 998244353 #define N 40000005 ll prime[3000005],m,F[100005],inv[100005]; bool vis[N]; ll Pow(ll a,ll b){ ll res=1; while(b){ if(b%2)res=res*a%mod; b>>=1;a=a*a%mod; } return res; } ll D,u,v; void init(){ F[0]=1; for(int i=1;i<=100000;i++){ F[i]=F[i-1]*i%mod; inv[i]=Pow(F[i],mod-2); } for(ll i=2;i*i<=D;i++)if(D%i==0){ prime[++m]=i; while(D%i==0) D/=i; } if(D>1)prime[++m]=D; sort(prime+1,prime+1+m); } ll p[1000005],mm,c[1000005]; void divide(ll x){ mm=0; for(int i=1;i<=m;i++){ if(prime[i]*prime[i]>x)break; if(x%prime[i]==0){ p[++mm]=prime[i]; c[mm]=0; while(x%prime[i]==0) ++c[mm],x/=prime[i]; } } if(x>1){ p[++mm]=x; c[mm]=1; } } ll solve(ll x){ divide(x); ll res=1,sum=0; for(int i=1;i<=mm;i++)sum+=c[i]; res=F[sum]; for(int i=1;i<=mm;i++) res=res*inv[c[i]]%mod; return res; } int main(){ cin>>D; init(); int q;cin>>q; while(q--){ scanf("%lld%lld",&u,&v); ll d=__gcd(u,v); ll ans=1; u/=d;v/=d; ans=ans*solve(u)%mod; ans=ans*solve(v)%mod; cout<<ans<<' '; } }