题意
求 ∏ i = a b ∏ j = c d gcd ( x i , y j ) \prod_{i=a}^b\prod_{j=c}^d\gcd(x^i,y^j) i=a∏bj=c∏dgcd(xi,yj)
分析
拆一下质因子。先枚举
i
i
i,然后
i
i
i相同时,用
p
p
p表示当前的质因数,设
x
x
x中有
u
u
u个
p
p
p,
y
y
y中有
v
v
v个
p
p
p,比较一下
i
∗
u
i*u
i∗u和
j
∗
v
j*v
j∗v的大小即可。把小的乘到答案里去。定义变量
P
P
P来记录循环时
p
p
p需要乘的次数。
设
t
m
p
tmp
tmp为分割点,则
t
m
p
=
k
∗
u
/
v
tmp=k*u/v
tmp=k∗u/v。若
t
m
p
<
c
tmp<c
tmp<c,说明
c
c
c到
d
d
d之间
i
∗
u
i*u
i∗u一直小于
j
∗
v
j*v
j∗v,把
d
−
c
+
1
d-c+1
d−c+1个当前的
i
∗
u
i*u
i∗u加入到
P
P
P中,若
t
m
p
>
d
tmp>d
tmp>d,说明
c
c
c到
d
d
d之间
i
∗
u
i*u
i∗u一直大于
j
∗
v
j*v
j∗v,等差数列把所有的j加起来乘
v
v
v加入到
P
P
P中,如果
t
m
p
tmp
tmp在
c
c
c和
d
d
d中间则说明
i
∗
u
i*u
i∗u和
j
∗
v
j* v
j∗v的大小关系并不恒定,老老实实来就行。每次循环结束时答案乘
p
P
p^P
pP即可。
剩下就是瞎搞了。
#include<iostream>
#define ll long long
using namespace std;
const int mod=998244353;
ll qpow(ll a,ll x)
{
int res=1;
while(x)
{
if(x&1)res=res*a%mod;
a=a*a%mod;
x>>=1;
}
return res;
}
int p[205],p2[205],q[205],q2[205],ln,ln2;
int main()
{
int a,b,c,d,x,y;
cin>>a>>b>>c>>d>>x>>y;
for(int i=2;i<=x;i++)
{
if(x%i==0)p[++ln]=i;
while(x%i==0)
{
q[ln]++;
x/=i;
}
}
for(int i=2;i<=y;i++)
{
if(y%i==0)p2[++ln2]=i;
while(y%i==0)
{
q2[ln2]++;
y/=i;
}
}
ll ans=1;
for(int i=1;i<=ln;i++)
{
for(int j=1;j<=ln2;j++)
{
if(p[i]==p2[j])
{
int u=q[i],v=q2[j];
ll P=0;
for(int k=a;k<=b;k++)//枚举i
{
ll tmp=1ll*k*u/v;
if(tmp<c)P=(P+1ll*(d-c+1)*k%(mod-1)*u%(mod-1))%(mod-1);
else if(tmp>d)P=(P+1ll*(d-c+1)*(c+d)/2%(mod-1)*v%(mod-1))%(mod-1);//等差数列求和
else
{
P=(P+1ll*(tmp-c+1)*(c+tmp)/2%(mod-1)*v%(mod-1))%(mod-1);
P=(P+1ll*(d-tmp)*k%(mod-1)*u%(mod-1))%(mod-1);
}
}
ans=ans*qpow(p[i],P)%mod;
}
}
}
cout<<ans;
return 0;
}