原题题面

As we all know,“Groundhog chasing death” means “GCD”,while “GCD” stands for “greatest common divisor”.
So you need to calculate ∏i=ab∏j=cdgcd⁡(xi,yj)\prod_{i=a}^b\prod_{j=c}^d\gcd(x^i,y^j)∏i=ab​∏j=cd​gcd(xi,yj) modulo 998244353998244353998244353

输入格式

One line which contains six intergers a,b,c,d,x,ya,b,c,d,x,ya,b,c,d,x,y.
0≤a,b,c,d≤3e6,a≤b,c≤d,0≤x,y≤1e90\leq a,b,c,d\leq 3e6,a\leq b,c\leq d,0\leq x,y \leq 1e90≤a,b,c,d≤3e6,a≤b,c≤d,0≤x,y≤1e9

输出格式

One line which contains ∏i=ab∏j=cdgcd⁡(xi,yj)\prod_{i=a}^b\prod_{j=c}^d\gcd(x^i,y^j)∏i=ab​∏j=cd​gcd(xi,yj) modulo 998244353998244353998244353

输入样例1

1 2 1 2 8 4

输出样例1

2048

输入样例2

1 2 3 4 120 180

输出样例2

235140177

题面分析

第一眼以为是莫反就屁颠屁颠地化式子去了,果然画不出来
首先我们给出gcd的另一种定义,
对于a=∏i=1mpixi,b=∏i=1npiyia=\prod_{i=1}^{m}p_{i}^{x_i},b=\prod_{i=1}^{n}p_{i}^{y_i}a=∏i=1m​pixi​​,b=∏i=1n​piyi​​
gcd(a,b)=∏i=1min(m,n)pimin(xi,yi)gcd(a,b)=\prod_{i=1}^{min(m,n)}p_{i}^{min(x_i,y_i)}gcd(a,b)=∏i=1min(m,n)​pimin(xi​,yi​)​
证明略,稍加理解即可。
那我们可以考虑去计算每个质因子pip_ipi​对答案的贡献。
把原式的x,yx,yx,y质因子分解后,对于某一个质因子ppp,设xxx对应的次数为k1k_1k1​,yyy对应的次数为k2k_2k2​
那么pip_ipi​的贡献就是pi∑i=1b∑j=cdmin(k1i,k2j)p_i^{\sum_{i=1}^{b}\sum_{j=c}^{d}min(k_1i,k_2j)}pi∑i=1b​∑j=cd​min(k1​i,k2​j)​
对于∑i=1b∑j=cdmin(k1i,k2j)\sum_{i=1}^{b}\sum_{j=c}^{d}min(k_1i,k_2j)∑i=1b​∑j=cd​min(k1​i,k2​j)
根据minminmin的取值不同,我们分成两种情况。
①k1i≤k2jk_1i\leq k_2jk1​i≤k2​j
此时可以得到j≥k1k2ij\geq\frac{k_1}{k_2}ij≥k2​k1​​i,所以这部分求和的结果是∑i=ab∑j=max(c,⌈k1k2i⌉)dk1i\sum_{i=a}^{b}\sum_{j=max(c,\lceil\frac{k_1}{k2}i\rceil)}^{d}k_1i∑i=ab​∑j=max(c,⌈k2k1​​i⌉)d​k1​i
化简得k1∑i=abi∗[d−max(c,⌈k1k2i⌉)+1]k_1\sum_{i=a}^{b}i*[d-max(c,\lceil\frac{k_1}{k_2}i\rceil)+1]k1​∑i=ab​i∗[d−max(c,⌈k2​k1​​i⌉)+1]
②k1i>k2jk_1i>k_2jk1​i>k2​j
此时可以得到i>k2k1ji>\frac{k_2}{k_1}ji>k1​k2​​j,所以这部分求和的结果是∑j=cd∑i=max(a,⌈k1k2j⌉)bk2j\sum_{j=c}^{d}\sum_{i=max(a,\lceil\frac{k_1}{k2}j\rceil)}^{b}k_2j∑j=cd​∑i=max(a,⌈k2k1​​j⌉)b​k2​j
同理得到k2∑j=cdj∗[b−max(a,⌊k2k1j⌋+1)+1]k_2\sum_{j=c}^{d}j*[b-max(a,\lfloor\frac{k_2}{k_1}j\rfloor+1)+1]k2​∑j=cd​j∗[b−max(a,⌊k1​k2​​j⌋+1)+1]
所以∑i=1b∑j=cdmin(k1i,k2j)\sum_{i=1}^{b}\sum_{j=c}^{d}min(k_1i,k_2j)∑i=1b​∑j=cd​min(k1​i,k2​j)
=k1∑i=abi∗[d−max(c,⌈k1k2i⌉)+1]+k2∑j=cdj∗[b−max(a,⌊k2k1j⌋+1)+1]=k_1\sum_{i=a}^{b}i*[d-max(c,\lceil\frac{k_1}{k_2}i\rceil)+1]+k_2\sum_{j=c}^{d}j*[b-max(a,\lfloor\frac{k_2}{k_1}j\rfloor+1)+1]=k1​∑i=ab​i∗[d−max(c,⌈k2​k1​​i⌉)+1]+k2​∑j=cd​j∗[b−max(a,⌊k1​k2​​j⌋+1)+1]
因为质因子的个数很小,前9个质数相乘就已经超出1e91e91e9了,故枚举质因子复杂度为O(9)O(9)O(9)
暴力计算贡献的复杂度是O(3e6)O(3e6)O(3e6)
质因子分解的复杂度最大是O(32)O(32)O(32)(即x=232x=2^{32}x=232的时候)
因此总复杂度为O(9×3e6×32)O(9\times3e6\times32)O(9×3e6×32)(实际复杂度远比这小)

AC代码(1175ms)

值得注意的地方有两个:
1.要使用欧拉降幂加速
2.使用欧拉降幂时注意模数是p−1p-1p−1不是ppp(具体的请看代码)

#include<bits/stdc++.h>
using namespace std;
const long long MAXN=2e5;
const long long mod=998244353;
int prime[MAXN];//素数数组
bool is_prime[MAXN+10];//is_pri[i]表示i是素数
int factorX[MAXN+10];
int sumX=0;
int sumY=0;
int factorY[MAXN+10];
long long a, b, c, d, x, y;
int sumPrime;
//返回n以内素数的个数
inline long long quick_pow(long long a, long long b)//快速幂
{long long ans=1, base=a;while(b!=0){if (b&1)ans=(long long) ans*base%mod;base=(long long) base*base%mod;b>>=1;}return ans;
}
int sieve(int n)
{int p=0;//素数个数计数器for(int i=0; i<=n; i++)is_prime[i]=true;is_prime[0]=is_prime[1]=false;//首先标记0和1不是素数is_prime[2]=true;//标记2是素数for(int i=2; i<=sqrt(n); i++){if (is_prime[i]) //如果i是素数{for(int j=i*i; j<=n; j+=i)//所有i的倍数都不是素数is_prime[j]=false;}}for(int i=1; i<=n; i++)if (is_prime[i])prime[++p]=i;return p;
}
void init()//质因子分解
{for(int i=1; i<=sumPrime && x!=1; i++){if (x%prime[i]==0){sumX=i;while(x!=1 && x%prime[i]==0){x/=prime[i];factorX[i]++;}}}if (x!=1){sumPrime++;prime[sumPrime]=x;factorX[sumPrime]++;}for(int i=1; i<=sumPrime && y!=1; i++){if (y%prime[i]==0){sumY=i;while(y!=1 && y%prime[i]==0){y/=prime[i];factorY[i]++;}}}if (y!=1){sumPrime++;prime[sumPrime]=y;factorY[sumPrime]++;}
}
void solve()
{sumPrime=sieve((int) 2e5);scanf("%lld%lld%lld%lld%lld%lld", &a, &b, &c, &d, &x, &y);init();long long ans=1;for(int z=1; z<=min(sumX, sumY); z++){if (factorX[z] && factorY[z]){long long powP1=0, powP2=0;for(long long i=a; i<=b; i++){long long j;if(factorX[z]*i%factorY[z]==0){j=(long long)max(factorX[z]*i/factorY[z],c);}else{j=(long long)max(factorX[z]*i/factorY[z]+1,c);}if (j<=d && j>=0)powP1=(powP1+(long long) i*((d-j+1+(mod-1))%(mod-1))%(mod-1))%(mod-1);}powP1=(long long) powP1*factorX[z]%(mod-1);for(long long i=c; i<=d; i++){long long j;j=(long long) max(factorY[z]*i/factorX[z]+1, a);if (j<=b && j>=0)powP2=(powP2+(long long) i*((b-j+1+(mod-1))%(mod-1))%(mod-1))%(mod-1);}powP2=(long long) powP2*factorY[z]%(mod-1);ans=(long long) (ans*quick_pow(prime[z], (powP1+powP2)%(mod-1)))%mod;}}printf("%lld\n", ans);
}
int main()
{//    ios_base::sync_with_stdio(false);
//    cin.tie(0);
//    cout.tie(0);
#ifdef ACM_LOCALfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);long long test_index_for_debug=1;char acm_local_for_debug;while(cin>>acm_local_for_debug){cin.putback(acm_local_for_debug);if (test_index_for_debug>100){throw runtime_error("Check the stdin!!!");}auto start_clock_for_debug=clock();solve();auto end_clock_for_debug=clock();cout<<"\nTest "<<test_index_for_debug<<" successful"<<endl;cerr<<"Test "<<test_index_for_debug++<<" Run Time: "<<double(end_clock_for_debug-start_clock_for_debug)/CLOCKS_PER_SEC<<"s"<<endl;cout<<"--------------------------------------------------"<<endl;}
#elsesolve();
#endifreturn 0;
}

后记

赛中傻逼了,欧拉降幂模数一直错,白白WA了3发…
DrGilbert 2020.8.9

Groundhog Chasing Death 2020牛客多校第九场(质因子分解+欧拉降幂)相关推荐

  1. 2020 牛客多校第一场

    2020 牛客多校第一场 A. B-Suffix Array 后缀数组的思想:倍增+桶排序的方式找出一串连续序列后缀的大小.虽说正常使用的时候都是字典序,但是只要修改排序方式,也能够达到一个类似的&q ...

  2. 2019牛客多校第九场AThe power of Fibonacci(广义BM)

    2019牛客多校第九场AThe power of Fibonacci(广义BM) 题目大意 求斐波那契数列m次方的前n项和 解题思路 显然,斐波那契的m次方前缀和依然是线性递推,因此考虑用exBM求解 ...

  3. Cutting Bamboos(牛客多校第九场H主席树+二分+思维)

    链接:https://ac.nowcoder.com/acm/contest/889/H 来源:牛客网 There are n bamboos arranged in a line. The i-th ...

  4. Quadratic equation(二次剩余)2019牛客多校第九场

    链接:https://ac.nowcoder.com/acm/contest/889/B 来源:牛客网 题目描述 Amy asks Mr. B problem B. Please help Mr. B ...

  5. [2020牛客多校第一场]Coda的题解集

    被暴打了. 会先写比赛中过题数100+的题目,其他的以后再补. 施工中,未完待续- F Infinite String Comparision 一开始想到的是对比到lcm(|a|,|b|),意料之中T ...

  6. 2020牛客多校第一场B虚树+质数筛+换根dp

    题目大意: 1.可以发现阶乘增长是很快的所以你要把整颗树建立出来是不实际的. 2.我们可以假设这棵树已经建出来出来了我们应该怎么搞 首先很明显是一个树形dp, 我们设dp[j],是以j为u到其他点距离 ...

  7. 2019牛客多校第九场 H Cutting Bamboos (二分主席树)

    看到题解说二分 心里也有数了..... H Cutting Bamboos 给了一些高度得柱子 每区间你可以坎y次 y次之后 必须砍没有了 没有砍 总长度得一样 问第x次砍得高度在哪里 因为砍得次数 ...

  8. 2019牛客多校第九场AThe power of Fibonacci——扩展BM

    题意 求斐波那契数列m次方的前n项和,模数为 $1e9$. 分析 线性递推乘线性递推仍是线性递推,所以上BM. 由于模数非质数,上扩展版的BM. 递推多少项呢?本地输入发现最大为与前57项有关(而且好 ...

  9. 牛客多校第九场 H Cutting Bamboos —— 主席树

    题目链接:点我啊╭(╯^╰)╮ 题目大意: 给你一片竹林,编号 1 1 1 到 n n n ,给定初始高度     每次查询区间,问一共砍 y y y 刀的时候,第 x x x 刀的高度     要求 ...

  10. 2019牛客多校第一场

    2019牛客多校第一场 题号 题目 知识点 A Monotonic Matrix B Symmetric Matrix C Fluorescent 2 D Two Graphs E Removal F ...

最新文章

  1. 【运维】详解 /etc/fstab
  2. cass3d基础版_v1.1_仪表不凡说表:N厂“一劳永逸”V11版实至名归!
  3. Python多进程multiprocessing共享数据Value(包括常用的整数、字符串)、列表及字典以及Queue
  4. 【软考】2017年11月软件设计师上午真题1-4题答案解析
  5. python调换字符串顺序_python实现指定字符串交换
  6. BZOJ4305 数列的GCD
  7. Centos7下载linux内核源码
  8. 图解机器学习算法(5) | 朴素贝叶斯算法详解(机器学习通关指南·完结)
  9. 大话WebRTC的前世今生
  10. Android中使用webview加载网页上的按钮点击失效
  11. iio Engine 1
  12. 实验吧 NSCTF web200
  13. MP-SPDZ详细介绍
  14. OCR识别技术保险保单识别系统|车险保单识别寿险保单识别|助力保险理赔
  15. 万国数据指责Blue Orca恶意做空 称做空报告断章取义
  16. mysql数据库完整实例-“汽车维修”
  17. gittrack_什么时候使用git branch –track(开始“看上游”的意思)?
  18. python单词翻译-python 中英文翻译
  19. 注释、标识符、关键字、数据类型、类型转换
  20. Live555: RtspServer 示例

热门文章

  1. 我的世界玩服务器虚拟内存高崩,服务端崩溃 - 崩溃解答 - MC百科社群 - MC百科|最大的Minecraft中文MOD百科...
  2. Python Spider入门
  3. VB中数组的嵌套循环
  4. mirna富集分析_miRNA芯片数据挖掘文章套路
  5. matlab 定义自然数变量,matlab数值数据和变量名
  6. python编程自然数表达式_实现四则运算 (python实现)by 周乃君 张宏根
  7. 二项式系数表--杨辉三角形
  8. 简单分账系统的分账流程是什么样的?
  9. Openssl 编译
  10. (转)学习打印机,了解打印命令 .