博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Educational Codeforces Round 26 E - Vasya's Function
阅读量:4316 次
发布时间:2019-06-06

本文共 1047 字,大约阅读时间需要 3 分钟。

数论题还是好恶心啊。

题目大意:给你两个不超过1e12的数 x,y,定义一个f ( x, y ) 如果y==0 返回 0 否则返回1+ f ( x , y - gcd( x , y ) );

 

思路:我们设gcd ( x , y) 为G,那么 设 x  = A*G,y = B*G,我们考虑减去多少个G时x y 的gcd会改变,我们设减去

k个G的时候 x和y 的gcd为改变,即 A*G 和 ( B - k ) * G 的 gcd 改变了,什么情况下会改变呢,就是A 和( B -  k )的gcd

不为 1 ,这样我们就不断地找出 k 就能得出答案。那么现在问题变成了怎么快速地求出 k ,我们设 A 中的某个因子为

r,则( B - k )%r == 0 , 设( B - k ) / r的商为 q ,则 B - k = q * r  变形一下变成,B = k + q * r ,两边对 r  取余,B % r = k

这样我们就能用 B 和 A中的质因数求出 k ,那么我们每次需要记录的就是,B 是 A和B的gcd 的多少倍就,以及A的没有被

用过的质因数。

#include
#define ll long longusing namespace std;ll a,b,ans=0;vector
va;void work(ll y)// y值表示目前 b的值为 gcd(a,b)的y倍。{ if(y==0) return; ll k=y; for(int i=0;i
vb; for(int i=0;i
>a>>b; ll gcd=__gcd(a,b); a/=gcd;b/=gcd;//保证了a和b没有公共的因子。 for(ll i=2;i*i<=a;i++) { while(a%i==0) { va.push_back(i); a/=i; } } if(a>1) va.push_back(a); for(int i=0;i
View Code

 

转载于:https://www.cnblogs.com/CJLHY/p/7297754.html

你可能感兴趣的文章
HDU 2072(字符串的流式操作,学习了)
查看>>
win10 vs2015源码编译opencv、opencv_contrib、Tesseract
查看>>
css取消a标签在移动端点击时的背景颜色
查看>>
Annotation(注解)
查看>>
MySQL(四)--练习题
查看>>
高效掌握C#第五回---猜单词游戏
查看>>
07-Java 中的IO操作
查看>>
uclibc,eglibc,glibc之间的区别和联系【转】
查看>>
Java魔法堂:找外援的利器——Runtime.exec详解
查看>>
mysql数据库存放路径
查看>>
TestNG(五)常用元素的操作
查看>>
解决 Visual Studio 点击添加引用无反应的问题
查看>>
通过镜像下载Android系统源码
查看>>
python字符串格式化 %操作符 {}操作符---总结
查看>>
windows 不能在 本地计算机 启动 Apache
查看>>
iOS开发报duplicate symbols for architecture x86_64错误的问题
查看>>
Chap-6 6.4.2 堆和栈
查看>>
【Java学习笔记之九】java二维数组及其多维数组的内存应用拓展延伸
查看>>
C# MySql 连接
查看>>
网络抓包分析方法大全
查看>>