题意

计算
∏ i = a b ∏ j = c d g c d ( x i , y j ) \prod_{i=a}^{b}\prod_{j=c}^{d}gcd(x^i,y^j) i=a∏b​j=c∏d​gcd(xi,yj)

0 ≤ a , b , c , d ≤ 3 e 6 , 0 < x , y ≤ 1 e 9 , a ≤ b , c ≤ d ; 0 \leq a,b,c,d \leq 3e6,0 < x,y \leq 1e9,a \leq b,c \leq d; 0≤a,b,c,d≤3e6,0<x,y≤1e9,a≤b,c≤d;

题解

先求出x,y的GCD,在对GCD质因子分解,对于每一个计算出的质因子V;

计算出x中有cnt1V,y中有cnt2V;

之后枚举从ab,对于枚举的一个i来说

x中有cnt1 * iv,y中有cnt2*(c -> d)个V,则V对答案的贡献为
V ∑ j = c d m i n ( c n t 1 ∗ i , c n t 2 ∗ j ) V^{\sum_{j=c}^{d}min(cnt1*i,cnt2*j)} V∑j=cd​min(cnt1∗i,cnt2∗j)

暴力枚举cd肯定不行,考虑分类讨论

①cnt1 * i >= cnt2 * d

这种情况时,对于每一个j,cnt2 * j都是较小值,所以对于这种情况下:
s u m = ∑ j = c d c n t 2 ∗ j sum=\sum_{j=c}^{d}cnt2*j sum=j=c∑d​cnt2∗j
根据等差数列求和公式,很容易就计算出答案;

②cnt1 * i <= cnt2 * c

这种情况时,对于每一个j,cnt1 * i都是较小值,所以对于这种情况下:
s u m = ∑ j = c d c n t 1 ∗ i sum=\sum_{j=c}^{d}cnt1*i sum=j=c∑d​cnt1∗i
常数数列更加容易计算

③不是以上情况时

这种情况时,说明存在某个pos使得pos之前时都是cnt2 * j为较小值,pos及以后的j都是cnt1 * i为较小值;

这是直接二分pos存在分界位置,所以对于这种情况下:
s u m = ∑ j = c p o s − 1 c n t 2 ∗ j + ∑ j = p o s d c n t 1 ∗ i sum=\sum_{j=c}^{pos-1}cnt2*j+\sum_{j=pos}^{d}cnt1*i sum=j=c∑pos−1​cnt2∗j+j=pos∑d​cnt1∗i
对于每一个质因子都计算出该贡献,连乘即为答案;

!!!注意sum在累加过程中会爆longlong,需要用__int128存,因此快速幂幂次项也要用__int128存

代码实现

/*******************************
*   Coder : He Shuo.           *
*   Type : Original Work       *
*******************************/#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
typedef __int128 LL;
const ll mo = 998244353;
ll fpow(ll a,LL b)///幂次项用__int128存
{ll s = 1;a %= mo;while(b){if(b & 1)s = s * a % mo;a = a * a % mo;b >>= 1;}return s;
}ll a,b,c,d,x,y;vector<ll>e;///存因子ll func(ll l,ll r,ll key,ll num)///二分寻找pos分界位置
{ll mid;while(l < r){mid = l + r >> 1;if(mid * num > key)r = mid;else l = mid + 1;}return l;
}int main()
{scanf("%lld%lld%lld%lld%lld%lld",&a,&b,&c,&d,&x,&y);ll gcd = __gcd(x,y);for(int i = 2;i * i <= gcd;++ i)///对gcd质因子分解{if(gcd % i == 0){e.push_back(i);while(gcd % i == 0)gcd /= i;}}if(gcd > 1)e.push_back(gcd);ll ans = 1;for(int pos = 0;pos < e.size();++ pos){ll v = e[pos];ll cnt1 = 0,cnt2 = 0;while(x % v == 0)x /= v,cnt1 ++;///对于每一个V计算出x有多少个;while(y % v == 0)y /= v,cnt2 ++;///对于每一个V计算出y有多少个;LL sum = 0;///!!sum会爆longlong,用__int128存;for(ll i = a;i <= b;i ++){LL res = 0;if(cnt1 * i >= cnt2 * d)res = (cnt2 * c + cnt2 * d) * (d - c + 1) / 2;///第一种情况,等差数列求和公式计算~else if(cnt1 * i <= cnt2 * c)res = (d - c + 1) * (cnt1 * i);///第二种情况,常数列求和简简单单~else///第三种情况,找到pos分界位置之后,简单计算一下~{ll pos = func(c,d,cnt1 * i,cnt2);res = (cnt2 * c + cnt2 * (pos - 1)) * (pos - c) / 2 + (d - pos + 1) * (cnt1 * i);}sum += res;}ans = (ans * fpow(v,sum)) % mo;///累乘计算答案~}printf("%lld",ans);
}///写完提交,Accepted你值得拥有~

2020牛客暑期多校训练营(第九场)E题 Groundhog Chasing Death相关推荐

  1. E Groundhog Chasing Death(2020牛客暑期多校训练营(第九场))(思维+费马小定理+质因子分解)

    E Groundhog Chasing Death(2020牛客暑期多校训练营(第九场))(思维+费马小定理+质因子分解) 链接:https://ac.nowcoder.com/acm/contest ...

  2. 2020牛客暑期多校训练营(第六场)

    2020牛客暑期多校训练营(第六场) 额,睡了一下午,直接错过了比赛... 文章目录 A African Sort 题意: 题解: 代码: B Binary Vector C Combination ...

  3. 2020牛客暑期多校训练营(第四场)

    2020牛客暑期多校训练营(第四场) 这场属实有点难受 文章目录 A Ancient Distance B Basic Gcd Problem 题目 代码: C Count New String D ...

  4. 2020牛客暑期多校训练营(第一场)

    文章目录 A B-Suffix Array B Infinite Tree C Domino D Quadratic Form E Counting Spanning Trees F Infinite ...

  5. 2020牛客暑期多校训练营(第二场)

    2020牛客暑期多校训练营(第二场) 最烦英语题 文章目录 A All with Pairs B Boundary C Cover the Tree D Duration E Exclusive OR ...

  6. 2020牛客暑期多校训练营(第七场)J.Pointer Analysis

    2020牛客暑期多校训练营(第七场)J.Pointer Analysis 题目链接 题目描述 Pointer analysis, which aims to figure out which obje ...

  7. 2020牛客暑期多校训练营(第三场)A.Clam and Fish

    2020牛客暑期多校训练营(第三场)A.Clam and Fish 题目链接 题目描述 There is a fishing game as following: The game contains ...

  8. 2020牛客暑期多校训练营(第五场)——E Bogo Sort

    2020牛客暑期多校训练营(第五场)--E Bogo Sort 题目描述 Today Tonnnny the monkey learned a new algorithm called Bogo So ...

  9. 2021牛客暑期多校训练营2,签到题CDFKI

    2021牛客暑期多校训练营2 题号 标题 已通过代码 通过率 团队的状态 A Arithmetic Progression 点击查看 6/72 未通过 B Cannon 点击查看 34/104 未通过 ...

最新文章

  1. Java读书笔记05 类与对象
  2. Oracle 11g安装
  3. 蒲公英怎么加入别人的网络_挖蒲公英吃的,抓紧看看吧!
  4. 开源项目商业模式分析(2) - 持续维护的重要性 - Selenium和WatiN
  5. BZOJ.2780.[SPOJ8093]Sevenk Love Oimaster(广义后缀自动机)
  6. 使用MyEclipse开发Java EE应用:用XDoclet创建EJB 2 Session Bean项目(二)
  7. Akka边学边写(3)-- ByteString介绍
  8. VMware下Ubuntu与宿主Windows共享文件夹
  9. 背包问题2 (lintcode)
  10. java线程状态切换图
  11. tfidf关键词提取php,TFIDF介绍
  12. 对数据中心动环监控系统的认识
  13. 百度电子商务平台“有啊”正式上线,中国的电子商务平台或将重新洗牌?
  14. 揭秘:寻找水军组织,宝妈兼职月入3000+
  15. 微信内置浏览器中使用一键打电话功能
  16. DML和DDL的区别
  17. 浏览器野史 UserAgent 列传(上)
  18. InputStream需要被多次使用的解决方案
  19. python读取excel文本单元格换行符_Excel自文本导入内容时如何做到单元格内换行...
  20. 【秒懂】数据分析没头绪?这七种高手常用统计分析方法都帮你总结好了!

热门文章

  1. 重拾C语言基础 进阶成为JAVA小老板
  2. 14位医疗AI专家齐聚一堂,「新一代人工智能院士高峰论坛」圆满落幕...
  3. 免费也好吃的软件午餐
  4. Scrum项目管理流程之站立会议
  5. 微信小程序样式点击开始倒计时(正则规则验证)手机号验证
  6. 一些简单的问题. 2的10次方与k (涉及到b k m的要用乘来解读)
  7. 用Firefox的userChrome.css定制自己的Firefox界面
  8. Riode多用途WooCommerce主题下载,打造卓越电商平台
  9. 全球及中国婴儿痤疮药行业专项调研及竞争策略分析报告2021-2027年版
  10. 基于51单片机的自动浇花系统设计