2020牛客暑期多校训练营(第九场)E题 Groundhog Chasing Death
题意
计算
∏ 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∏bj=c∏dgcd(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中有cnt1个V,y中有cnt2个V;
之后枚举从a到b,对于枚举的一个i来说
x中有cnt1 * i个v,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=cdmin(cnt1∗i,cnt2∗j)
暴力枚举c到d肯定不行,考虑分类讨论
①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∑dcnt2∗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∑dcnt1∗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−1cnt2∗j+j=pos∑dcnt1∗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相关推荐
- E Groundhog Chasing Death(2020牛客暑期多校训练营(第九场))(思维+费马小定理+质因子分解)
E Groundhog Chasing Death(2020牛客暑期多校训练营(第九场))(思维+费马小定理+质因子分解) 链接:https://ac.nowcoder.com/acm/contest ...
- 2020牛客暑期多校训练营(第六场)
2020牛客暑期多校训练营(第六场) 额,睡了一下午,直接错过了比赛... 文章目录 A African Sort 题意: 题解: 代码: B Binary Vector C Combination ...
- 2020牛客暑期多校训练营(第四场)
2020牛客暑期多校训练营(第四场) 这场属实有点难受 文章目录 A Ancient Distance B Basic Gcd Problem 题目 代码: C Count New String D ...
- 2020牛客暑期多校训练营(第一场)
文章目录 A B-Suffix Array B Infinite Tree C Domino D Quadratic Form E Counting Spanning Trees F Infinite ...
- 2020牛客暑期多校训练营(第二场)
2020牛客暑期多校训练营(第二场) 最烦英语题 文章目录 A All with Pairs B Boundary C Cover the Tree D Duration E Exclusive OR ...
- 2020牛客暑期多校训练营(第七场)J.Pointer Analysis
2020牛客暑期多校训练营(第七场)J.Pointer Analysis 题目链接 题目描述 Pointer analysis, which aims to figure out which obje ...
- 2020牛客暑期多校训练营(第三场)A.Clam and Fish
2020牛客暑期多校训练营(第三场)A.Clam and Fish 题目链接 题目描述 There is a fishing game as following: The game contains ...
- 2020牛客暑期多校训练营(第五场)——E Bogo Sort
2020牛客暑期多校训练营(第五场)--E Bogo Sort 题目描述 Today Tonnnny the monkey learned a new algorithm called Bogo So ...
- 2021牛客暑期多校训练营2,签到题CDFKI
2021牛客暑期多校训练营2 题号 标题 已通过代码 通过率 团队的状态 A Arithmetic Progression 点击查看 6/72 未通过 B Cannon 点击查看 34/104 未通过 ...
最新文章
- Java读书笔记05 类与对象
- Oracle 11g安装
- 蒲公英怎么加入别人的网络_挖蒲公英吃的,抓紧看看吧!
- 开源项目商业模式分析(2) - 持续维护的重要性 - Selenium和WatiN
- BZOJ.2780.[SPOJ8093]Sevenk Love Oimaster(广义后缀自动机)
- 使用MyEclipse开发Java EE应用:用XDoclet创建EJB 2 Session Bean项目(二)
- Akka边学边写(3)-- ByteString介绍
- VMware下Ubuntu与宿主Windows共享文件夹
- 背包问题2 (lintcode)
- java线程状态切换图
- tfidf关键词提取php,TFIDF介绍
- 对数据中心动环监控系统的认识
- 百度电子商务平台“有啊”正式上线,中国的电子商务平台或将重新洗牌?
- 揭秘:寻找水军组织,宝妈兼职月入3000+
- 微信内置浏览器中使用一键打电话功能
- DML和DDL的区别
- 浏览器野史 UserAgent 列传(上)
- InputStream需要被多次使用的解决方案
- python读取excel文本单元格换行符_Excel自文本导入内容时如何做到单元格内换行...
- 【秒懂】数据分析没头绪?这七种高手常用统计分析方法都帮你总结好了!
热门文章
- 重拾C语言基础 进阶成为JAVA小老板
- 14位医疗AI专家齐聚一堂,「新一代人工智能院士高峰论坛」圆满落幕...
- 免费也好吃的软件午餐
- Scrum项目管理流程之站立会议
- 微信小程序样式点击开始倒计时(正则规则验证)手机号验证
- 一些简单的问题. 2的10次方与k (涉及到b k m的要用乘来解读)
- 用Firefox的userChrome.css定制自己的Firefox界面
- Riode多用途WooCommerce主题下载,打造卓越电商平台
- 全球及中国婴儿痤疮药行业专项调研及竞争策略分析报告2021-2027年版
- 基于51单片机的自动浇花系统设计