gym103261 I. Euclid‘s Algorithm
题意
给你ddd和kkk
询问gcd((a+d)k−ak)gcd((a+d)^k-a^k)gcd((a+d)k−ak) 其中aaa为任意取值
ddd和kkk均为10^100
题解
看题目形式,显然是一个代码非常简短的数论题
不知道为啥过了一片,可能我们队伍的数论水平低于平均水平吧
首先先展开一下
(a+d)k−ak=∑i=1kCkidiak−i(a+d)^k-a^k=\sum_{i=1}^kC_k^id^{i}a^{k-i}(a+d)k−ak=i=1∑kCkidiak−i
先对每一种质数ppp分开考虑
考虑到,如果aaa也拥有ppp的话,答案在大多数情况都会变大,这对我们取gcd是不优的
故先考虑aaa不包含ppp的情况
先引入kummer定理
CmnC_m^nCmn中含有p的指数次数为m-n在p进制下的退位个数
即m-n在p进制下的退位个数为t,则有pt∣Cmnp^{t}| C_m^npt∣Cmn
不放先设d=d′∗pA,k=k′∗pBd=d'*p^A,k=k'*p^Bd=d′∗pA,k=k′∗pB
如果A=0A=0A=0显然就不用考虑这个质数了
对于一个iii来说,包含ppp的次幂为
t=Ai+B−f(i,p)t=Ai+B-f(i,p)t=Ai+B−f(i,p),其中f(i,p)f(i,p)f(i,p)为ppp在iii中的次幂
稍微解释一下B−f(i,p)B-f(i,p)B−f(i,p),这个等式至少在f(i,p)<Bf(i,p)<Bf(i,p)<B即i<pBi<p^Bi<pB时成立,在后文可以知道最小值仅需讨论这一范围就可以了
此时可以发现AiAiAi随着iii增加每次最少会增加A≥1A≥1A≥1,而f(i,p)f(i,p)f(i,p)的增量是不会超过111的
故ttt至少是单调不降的
i=1i=1i=1时t=A+Bt=A+Bt=A+B
i=2i=2i=2时t=2A+B−f(i,p)t=2A+B-f(i,p)t=2A+B−f(i,p)
故A>1A>1A>1时,i=1i=1i=1时ttt时唯一最小的,也就是p的贡献就是pA+Bp^{A+B}pA+B了
但当A=1A=1A=1时,如果f(2,p)=1f(2,p)=1f(2,p)=1,那么i=1i=1i=1和i=2i=2i=2的次数是一样的,也就是两项会合并
这种情况当且仅当p=2p=2p=2
合并之后贡献即为2∗pA+B2*p^{A+B}2∗pA+B,也就是此时答案要乘222
稍微验证一下,i=3i=3i=3是不可能和i=1,i=1i=1,i=1i=1,i=1同时相同的
但同时你会发现,若k=2k=2k=2,aaa此时就有用了,因为在i=2i=2i=2时,aaa的系数为000,故我们可以通过调整aaa是的两项的ppp的指数发生改变而不能合并,此时答案将会变小
故对于k=2k=2k=2的情况分开讨论即可
接下来,接下来的答案即为d出现过的质因子在k中出现的次数*d
这一步用一个简单的gcd就可以了
时间复杂度O(log2(k))O(log^2(k))O(log2(k))
高精度用python解决即可
def gcd (a,b):while (a!=0):t=b%ab=aa=treturn bd,k=list(map(int,input().split()))
if (k==2):print(d*(2-d%2))
else:ans=1while (1):now=gcd(k,d)if (now==1): breakk=k//nowans=ans*nowif (d%4==2): ans*=2print(ans*d)
gym103261 I. Euclid‘s Algorithm相关推荐
- 欧几里得 拓展欧几里得算法 讲解 (Euclid Extend- Euclid Algorithm)
欧几里得& 拓展欧几里得(Euclid & Extend-Euclid) 欧几里得算法(Euclid) 背景: 欧几里德算法又称辗转相除法,用于计算两个正整数a,b的最大公约数. ...
- C语言求最大公约数欧几里得Euclid算法(附完整源码)
最大公约数欧几里得Euclid算法 最大公约数欧几里得Euclid算法完整源码(定义,实现,main函数测试) 最大公约数欧几里得Euclid算法完整源码(定义,实现,main函数测试) #inclu ...
- Algorithm(算法
作者:starfish starfish@vip.sina.com 算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.在这个过程中,无论是形成解题思路还是编写程 ...
- 编译器架构Compiler Architecture(上)
编译器架构Compiler Architecture(上) 编译器是程序,通常是非常大的程序.它们几乎都有一个基于翻译分析综合模型的结构. CONTENTS Overview • Compiler C ...
- 余数定理_如何用Java实现余数定理
余数定理 by Anuj Pahade 由Anuj Pahade 如何用Java实现余数定理 (How to implement the Chinese Remainder Theorem in Ja ...
- 用Latex写IEEE论文
如果在搞科研,想在IEEE上发表文章,那么就不得不用IEEE的论文模板,分为doc版本和Tex版本.Tex是高德纳·纳什所写,大牛级的任务,写过<计算机程序设计艺术>,曾经是美国最年轻的科 ...
- python写接口自动化需要rsa加密_RSA加密,请问如何用Python实现该加密过程
展开全部 ^import random def gcd(a, b): while b != 0: a, b = b, a % b return a def multiplicative_inverse ...
- Licia:最全最实用的 JavaScript 工具库
前言 在业务开发过程中,我们经常会重复使用日期格式化.cookie 操作.模板.浏览器判断.类型判断等功能.为了避免不同项目之间进行复制粘贴,可以将这些常用的函数封装到一起并发布 npm 包.在将近三 ...
- 一些有意思的算法代码[转载]
转载自:http://coolshell.cn/articles/6010.html Keith Schwarz是一个斯坦福大学计算机科学系的讲师.他对编程充满了热情.他的主页上他自己正在实现各种各样 ...
- 每个程序员都应该知道的基础数论
这篇文章讨论了数论中每个程序员都应该知道的几个重要概念.本文的内容既不是对数论的入门介绍,也不是针对数论中任何特定算法的讨论,而只是想要做为数论的一篇参考.如果读者想要获取关于数论的更多细节,文中也提 ...
最新文章
- matlab神经网络工具箱函数汇总
- python代码案例详解-我用Python抓取了7000 多本电子书案例详解
- LiveBins缔造者
- 这样实现分布式锁,才叫优雅!
- 计算机视觉 | Python OpenCV 3 使用背景减除进行目标检测
- Oracle入门《Oracle介绍》第一章1-4 Oracle 用户管理
- #includeiostream与#includeiostream.h的区别
- windows【提权系列】— CVE-2016-7255
- LeetCode每日一题——无重复字符的最长子串
- Java 设计模式 之 单例模式(Singleton)
- mgr未同步 mysql_MySQL MGR--数据同步原理
- 2020年毕业生腾讯校园招聘提前批——后台开发——面试经验——分享给大家交流经验。
- 数据分析tableau 和 python的区别_数据分析师综述篇
- 新概念,数字游民面临的一些挑战和应对举措
- java 判断用户名_java如何判断用户名和密码
- canal.admin、adapter和deployer的区别
- 谁是全球芯片行业的“麒麟才子”?得之可得天下!
- Android项目开发如何设计整体架构?大牛最佳总结
- 电脑上最好的5个epub阅读器
- 无心剑中译伊丽莎白·毕肖普《一门技艺》