2020牛客多校E- Groundhog Chasing Death

原题
在这里插入图片描述

题意

∏ 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=abj=cdgcd(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 iu j ∗ v j*v jv的大小即可。把小的乘到答案里去。定义变量 P P P来记录循环时 p p p需要乘的次数。
t m p tmp tmp为分割点,则 t m p = k ∗ u / v tmp=k*u/v tmp=ku/v。若 t m p < c tmp<c tmp<c,说明 c c c d d d之间 i ∗ u i*u iu一直小于 j ∗ v j*v jv,把 d − c + 1 d-c+1 dc+1个当前的 i ∗ u i*u iu加入到 P P P中,若 t m p > d tmp>d tmp>d,说明 c c c d d d之间 i ∗ u i*u iu一直大于 j ∗ v j*v jv,等差数列把所有的j加起来乘 v v v加入到 P P P中,如果 t m p tmp tmp c c c d d d中间则说明 i ∗ u i*u iu j ∗ v j* v jv的大小关系并不恒定,老老实实来就行。每次循环结束时答案乘 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值