Educational Codeforces Round 26 E. Vasya's Function(数论)

标签: codeforces 数论
450人阅读 评论(0) 收藏 举报
分类:

传送门:点击打开链接

E. Vasya's Function
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

Vasya is studying number theory. He has denoted a function f(a, b) such that:

  • f(a, 0) = 0;
  • f(a, b) = 1 + f(a, b - gcd(a, b)), where gcd(a, b) is the greatest common divisor of a and b.

Vasya has two numbers x and y, and he wants to calculate f(x, y). He tried to do it by himself, but found out that calculating this function the way he wants to do that might take very long time. So he decided to ask you to implement a program that will calculate this function swiftly.

Input

The first line contains two integer numbers x and y (1 ≤ x, y ≤ 1012).

Output

Print f(x, y).

Examples
input
3 5
output
3
input
6 3
output
1

题意是……(不可描述)……。

两个递归,如果单纯的跑数据,第三组示例都过不了,别问我为什么。所以要选择优化,可以发现,在F的计算中,每一次的递归都牵扯到gcd(a,b),那么不妨把a,b划到最简,什么算最简形式,就是互质呗,这是一个困难的过程。枚举a的因子,让b除去b中所有跟a相等的因子,然后取所偶有数的最小值,看起来很麻烦,其实只需要b%a的因子取min就可以。如果a没有任何因子,也就是a是质数时结束循环,此时要再取一次tempb跟b%a的最小值,不然第14组数据都过不去,别问我为什么。最后运行时间30ms,还可以。注意所有的数据最好都用long long。


代码实现:


#include<iostream>
#include<algorithm>
#include<cmath>
#define ll long long

using namespace std;

ll gcd(ll x,ll y)
{
	if(x==0)
	return y;
	
	return gcd(y%x,x);
}

ll find(ll x,ll y)
{
	if(y==0)
	return 0;
	
	ll temp=gcd(x,y);
	x/=temp;y/=temp;
	ll tempa=x,tempb=y;
	
	for(ll i=2;i*i<=x;i++)
	{
		if(x%i)
		continue;
		
		tempb=min(tempb,y%i);
		while(x%i==0)
		x/=i;
	}
	
	if(x!=1)
	tempb=min(tempb,y%x);
	
	return find(tempa,y-tempb)+tempb;
}

int main()
{
	ll a,b;
	while(cin>>a>>b)
	{
		ll sum=find(a,b);
		cout<<sum<<endl;
	}
	return 0;
}


查看评论

Codeforces 837E Vasya's Function:数论入门初步

题意:定义F(a,0) = 0,F(a,b) = 1 + F(a,b - GCD(a,b)。给定 x 和 y ( 题解:a=A*GCD(a,b) b=B*GCD(a,b),那么b-GCD(a,b) ...
  • calabash_boy
  • calabash_boy
  • 2017-08-04 01:42:35
  • 914

codeforces837E Vasya's Function

首先在下参考了http://blog.csdn.net/calabash_boy/article/details/76652792 以及submit#29208538 数论什么的最讨厌了……设f(...
  • LiRewriter
  • LiRewriter
  • 2017-08-05 17:04:24
  • 444

Codeforces Round #392 (Div. 2)E. Broken Tree

题目大意:        对于一棵树有n个点,n-1条边,每条边有4个值x,y,w,p,x是离根进的点,y是另一个点,p和w都是特征值,又定义了broken tree的要求是一条边的p小于它所连子树的...
  • bigwaterlon
  • bigwaterlon
  • 2017-01-20 19:16:32
  • 438

Educational Codeforces Round #41 (D&E)

ABC就是暴力暴力暴力哇……D. Pair of Lines: 给出平面上n个点的坐标,问是否存在两条直线使得这n个点中的每一个都至少位于一条直线上。两条直线,首先要确定其中一条直线,然后将不在这条直...
  • NPU_SXY
  • NPU_SXY
  • 2018-04-05 10:38:15
  • 36

Educational Codeforces Round 39 (Rated for Div. 2) E Largest Beautiful Number

题目链接:点击打开链接题意:定义一种数,这里不妨称之为BN:它的十进制表示只有偶数位数,且不含前导零;此外,它的十进制表示的每个位上的数经过重新排列后能形成回文序列。在这里给定某个数n(十进制下长度不...
  • Lfhase
  • Lfhase
  • 2018-03-08 19:54:41
  • 32

Educational Codeforces Round 34 (Rated for Div. 2) E. Swapping Characters(暴力)

题目链接:http://codeforces.com/contest/903/problem/E 被这个题关了一天啊? 明显是个爆爆爆,因为最多允许有四个不同的位置,我们就暴力枚举交换就好...
  • sinat_32872703
  • sinat_32872703
  • 2017-12-14 21:35:28
  • 236

Codeforces Round #450 (Div. 2) E. Maximum Questions dp,重载小于号

E. Maximum Questions time limit per test2 seconds memory limit per test256 megabytes inputstandar...
  • zstu_zy
  • zstu_zy
  • 2017-12-12 11:35:39
  • 230

Educational Codeforces Round 34 (Rated for Div. 2) D

D. Almost Difference time limit per test 2 seconds memory limit per test 256 megabytes ...
  • ACM_e
  • ACM_e
  • 2017-12-14 13:44:15
  • 142

Codeforece Educational Codeforces Round 34 (Rated for Div. 2) (A-D)题解

A: A. Hungry Student Problem time limit per test 1 second memory limit per test 256 megab...
  • sizaif
  • sizaif
  • 2017-12-13 01:09:09
  • 211

cf Educational Codeforces Round 26 E. Vasya's Function

原题: E. Vasya’s Function time limit per test1 second memory limit per test256 megabytes inputstan...
  • tengfei461807914
  • tengfei461807914
  • 2017-08-12 11:30:02
  • 147
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 6万+
    积分: 2252
    排名: 2万+
    联系方式
    欢迎谈论交流:1245985209
    博客专栏