2020牛客暑期多校训练营(第九场)—— Groundhog Chasing Death
输入
样例1
1 2 1 2 8 4
样例2
1 2 3 4 120 180
输出
样例1
2048
样例2
235140177
题目大意
求 mod
题解
对给出的数分解质因数,然后对于每个质因数分别讨论其幂次。那么问题就从求 乘积问题转化为个子问题。对于每个子问题,在幂次上,形如给出两个数 , ,求。 那么可以枚举这个最小值是多少,是取到还是在取到,并可以𝑂(1)求出每种情况的方案数。注意处理好的情况,注意如果要对幂次取模,按照欧拉/费马小定理,模数应该取 。令,这种算法的最终复杂度是的,通过本题已经绰绰有余。
AC Code
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN=1e5+10;
const int MOD=998244353;
const int mod=MOD-1;
ll ksm(ll a,ll b)
{
ll ret=1;
while(b)
{
if(b&1)ret=ret*a%MOD;
a=a*a%MOD,b>>=1;
}
return ret;
}
ll a,b,c,d,x,y,ans=1;
void solve(int p)
{
ll aa=0,bb=0;
while(x%p==0)aa++,x/=p;
while(y%p==0)bb++,y/=p;
if(aa==0||bb==0)return;
ll tp=0;
for(ll i=a;i<=b;i++)
{
ll j=aa*i/bb,tmp,now;
if(j<c)tmp=(d-c+1)*i%mod*aa%mod;
else if(j>=d)tmp=(c+d)*(d-c+1)/2%mod*bb%mod;
else now=(c+j)*(j-c+1)/2%mod*bb%mod,tmp=(now+(d-j)*i%mod*aa%mod)%mod;
tp=(tp+tmp)%mod;
}
ans=1ll*ans*ksm(p,tp)%MOD;
}
int main()
{
scanf("%lld%lld%lld%lld%lld%lld",&a,&b,&c,&d,&x,&y);
for(int k=2;k<=x;k++)if(x%k==0)solve(k);
if(x>1)solve(x);
printf("%lld\n",ans%MOD);
}