Groundhog Chasing Death

题目:
https://ac.nowcoder.com/acm/contest/5674/E
calculate ∏ i = a b ∏ j = c d g c d ( x i , y j ) \prod\limits_{i=a}^{b}\prod\limits_{j=c}^{d}gcd(x^i,y^j) i=abj=cdgcd(xi,yj)modulo 998244353 998244353 998244353

思路:
∏ i = a b ∏ j = c d g c d ( x i , y j ) = ∏ i = a b ∏ j = c d ∏ k = 1 n p k m i n ( a k ⋅ i , b k ⋅ j ) p k 为 x 和 y 共 同 的 素 因 子 , a k 为 x 中 p k 的 幂 , 同 理 b k = ∏ k = 1 n ∏ i = a b ∏ j = c d p k m i n ( a k ⋅ i , b k ⋅ j ) \begin{aligned} &\prod\limits_{i=a}^{b}\prod\limits_{j=c}^{d}gcd(x^i,y^j)\\ =&\prod\limits_{i=a}^{b}\prod\limits_{j=c}^{d}\prod\limits_{k=1}^{n}p_k^{min(a_k\cdot i,b_k\cdot j)}\quad p_k为x和y共同的素因子,a_k为x中p_k的幂,同理b_k\\ =&\prod\limits_{k=1}^{n}\prod\limits_{i=a}^{b}\prod\limits_{j=c}^{d}p_k^{min(a_k\cdot i,b_k\cdot j)} \end{aligned} ==i=abj=cdgcd(xi,yj)i=abj=cdk=1npkmin(aki,bkj)pkxy,akxpk,bkk=1ni=abj=cdpkmin(aki,bkj)
然后分类讨论:
枚举 k k k i i i,当 j ≤ ⌊ a k ⋅ i b k ⌋ j\le\lfloor\frac{a_k\cdot i}{b_k}\rfloor jbkaki时, m i n ( a k ⋅ i , b k ⋅ j ) = b k ⋅ j min(a_k\cdot i,b_k\cdot j)=b_k\cdot j min(aki,bkj)=bkj,当 j ≥ ⌊ a k ⋅ i b k ⌋ + 1 j\ge\lfloor\frac{a_k\cdot i}{b_k}\rfloor+1 jbkaki+1时, m i n ( a k ⋅ i , b k ⋅ j ) = a k ⋅ i min(a_k\cdot i,b_k\cdot j)=a_k\cdot i min(aki,bkj)=aki
当然还要对 ⌊ a k ⋅ i b k ⌋ \lfloor\frac{a_k\cdot i}{b_k}\rfloor bkaki进行分类讨论,取其中一种情况说明。
c ≤ ⌊ a k ⋅ i b k ⌋ ≤ d c\le\lfloor\frac{a_k\cdot i}{b_k}\rfloor\le d cbkakid
∏ k = 1 n ∏ i = a b ∏ j = c d p k m i n ( a k ⋅ i , b k ⋅ j ) = ∏ k = 1 n ∏ i = a b p k b k ⋅ ( c + ⌊ a k ⋅ i b k ⌋ ) ⋅ ( ⌊ a k ⋅ i b k ⌋ − c + 1 ) 2 + a k ⋅ i ⋅ ( d − ⌊ a k ⋅ i b k ⌋ + 1 ) \begin{aligned} &\prod\limits_{k=1}^{n}\prod\limits_{i=a}^{b}\prod\limits_{j=c}^{d}p_k^{min(a_k\cdot i,b_k\cdot j)}\\ =&\prod\limits_{k=1}^{n}\prod\limits_{i=a}^{b}p_k^{b_k\cdot \frac{(c+\lfloor\frac{a_k\cdot i}{b_k}\rfloor)\cdot (\lfloor\frac{a_k\cdot i}{b_k}\rfloor-c+1)}{2}+a_k\cdot i\cdot (d-\lfloor\frac{a_k\cdot i}{b_k}\rfloor+1)} \end{aligned} =k=1ni=abj=cdpkmin(aki,bkj)k=1ni=abpkbk2(c+bkaki)(bkakic+1)+aki(dbkaki+1)
另外,可以预处理出 ∀ i ∈ [ 1 , 100000 ] , p k i , p k i ∗ 100000 \forall i\in[1,100000],p_k^i,p_k^{i*100000} i[1,100000],pki,pki100000的值。则欧拉降幂后 p k x = p k 100000 ⋅ a + b p_k^x=p_k^{100000\cdot a+b} pkx=pk100000a+b
a ≤ 100000 , b ≤ 100000 a\le100000,b\le100000 a100000,b100000。这样可以省掉一个快速幂。

代码:

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define ll long long
#define mod 998244353
using namespace std;
struct node
{
    ll p,num;
    node(int x,int y):p(x),num(y) {}
};
struct node1
{
    ll p,num,num1;
}w2[200];
struct node2
{
    ll sum[100001],sum1[100001];
}w3[200];
ll a,b,c,d,x,y,ans=1;
set<ll>w,w1;
set<ll>::iterator it;
map<ll,ll>ma,ma1;
int si,k=0;
int cmp(node a,node b)
{
    return a.num<b.num;
}
int main()
{
    cin>>a>>b>>c>>d>>x>>y;
    ll tmp=x;
    for(ll i=2; i*i<=tmp; i++)
    {
        if(x%i==0)
        {
            ll num=0;
            while(x%i==0)
            {
                num++;
                x/=i;
            }
            w.insert(i),ma[i]=num;
        }
    }
    if(x!=1)
        w.insert(x),ma[x]=1;
    tmp=y;
    for(ll i=2; i*i<=tmp; i++)
    {
        if(y%i==0)
        {
            ll num=0;
            while(y%i==0)
            {
                num++;
                y/=i;
            }
            w1.insert(i),ma1[i]=num;
        }
    }
    if(y!=1)
        w1.insert(y),ma1[y]=1;
    for(it=w.begin(); it!=w.end(); it++)
        if(w1.find((*it))!=w1.end())
            w2[k].p=(*it),w2[k].num=ma[(*it)],w2[k++].num1=ma1[(*it)];
    for(int i=0;i<k;i++)
    {
        w3[i].sum[0]=w3[i].sum1[0]=1;
        for(int j=1;j<=100000;j++)
            w3[i].sum[j]=w3[i].sum[j-1]*w2[i].p%mod;
        w3[i].sum1[1]=w3[i].sum[100000];
        for(int j=2;j<=100000;j++)
            w3[i].sum1[j]=w3[i].sum1[j-1]*w3[i].sum1[1]%mod;
    }
    for(ll i=a;i<=b;i++)
    {
        for(int j=0;j<k;j++)
        {
            ll locate=w2[j].num*i/w2[j].num1;
            if(locate<c)
                ans=ans*w3[j].sum[(w2[j].num*i*(d-c+1)%(mod-1))%100000]%mod*w3[j].sum1[(w2[j].num*i*(d-c+1)%(mod-1))/100000]%mod;
            else if(locate>=c&&locate<=d)
                ans=ans*w3[j].sum[(w2[j].num1*((c+locate)*(locate-c+1)/2)%(mod-1))%100000]%mod*w3[j].sum1[(w2[j].num1*((c+locate)*(locate-c+1)/2)%(mod-1))/100000]%mod*w3[j].sum[(w2[j].num*i*(d-locate)%(mod-1))%100000]%mod*w3[j].sum1[(w2[j].num*i*(d-locate)%(mod-1))/100000]%mod;
            else
                ans=ans*w3[j].sum[(w2[j].num1*((c+d)*(d-c+1)/2)%(mod-1))%100000]%mod*w3[j].sum1[(w2[j].num1*((c+d)*(d-c+1)/2)%(mod-1))/100000]%mod;
        }
    }
    cout<<ans;
    return 0;
}

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、5资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值