C. Number Transformation
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

Little Petya likes positive integers a lot. Recently his mom has presented him a positive integer a. There's only one thing Petya likes more than numbers: playing with little Masha. It turned out that Masha already has a positive integer b. Petya decided to turn his number a into the number b consecutively performing the operations of the following two types:

  1. Subtract 1 from his number.
  2. Choose any integer x from 2 to k, inclusive. Then subtract number (a mod x) from his number a. Operation a mod x means taking the remainder from division of number a by number x.

Petya performs one operation per second. Each time he chooses an operation to perform during the current move, no matter what kind of operations he has performed by that moment. In particular, this implies that he can perform the same operation any number of times in a row.

Now he wonders in what minimum number of seconds he could transform his number a into number b. Please note that numbers x in the operations of the second type are selected anew each time, independently of each other.

Input

The only line contains three integers ab (1 ≤ b ≤ a ≤ 1018) and k (2 ≤ k ≤ 15).

Please do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use the cin, cout streams or the %I64dspecifier.

Output

Print a single integer — the required minimum number of seconds needed to transform number a into number b.

Examples
input
10 1 4
output
6
input
6 3 10
output
2
input
1000000000000000000 1 3
output
666666666666666667
Note

In the first sample the sequence of numbers that Petya gets as he tries to obtain number b is as follows: 10  →  8  →  6  →  4  →  3  →  2  →  1.

In the second sample one of the possible sequences is as follows: 6  →  4  →  3.

题意:

给出 a b k

求a变到b的最小步数,每一步可以选择两种变化中的一种:a=a-1和a=a-a%i (2<=i<=k);

代码:

//k最大只有15,首先要想到2~15的lcm必然是一个循环节,然后就可以利用分块的思想,分成(a-1)/lcm+1块,每一块
//的大小是lcm,然后中间整个块的可以计算(每一块最大不会超过360360),两边的剩余的也可以计算了。这里我用的
//记忆化bfs找的。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=;
int k,vis[MAXN];
int gcd_(int x,int y) { return y==?x:gcd_(y,x%y); }
int lcm_(int x,int y) { return x/gcd_(x,y)*y; }
ll bfs(ll x,ll y)
{
queue<ll>q;
memset(vis,-,sizeof(vis));
q.push(x);
vis[x-y]=;
while(!q.empty()){
ll now=q.front();q.pop();
if(now==y) return vis[];
for(int i=;i<=k;i++){
ll xx=now-now%i;
if(xx<y||vis[xx-y]!=-) continue;
vis[xx-y]=vis[now-y]+;
q.push(xx);
}
ll xx=now-;
if(vis[xx-y]!=-) continue;
vis[xx-y]=vis[now-y]+;
q.push(xx);
}
}
int main()
{
ll a,b,ans=;
cin>>a>>b>>k;
if(k==){
cout<<a-b<<"\n";
return ;
}
ll last=;
for(int i=;i<=k;i++) last=lcm_(last,i);
ll tmp1=a/last;
ll tmp2=(b-)/last+;
if(tmp1>tmp2) ans=bfs(a,tmp1*last)+(tmp1-tmp2)*bfs(last,)+bfs(last*tmp2,b);
else ans=bfs(a,b);
cout<<ans<<"\n";
return ;
}

codeforces.com/contest/251/problem/C的更多相关文章

  1. codeforces.com/contest/325/problem/B

    http://codeforces.com/contest/325/problem/B B. Stadium and Games time limit per test 1 second memory ...

  2. [E. Ehab's REAL Number Theory Problem](https://codeforces.com/contest/1325/problem/E) 数论+图论 求最小环

    E. Ehab's REAL Number Theory Problem 数论+图论 求最小环 题目大意: 给你一个n大小的数列,数列里的每一个元素满足以下要求: 数据范围是:\(1<=a_i& ...

  3. http://codeforces.com/contest/555/problem/B

    比赛时虽然贪了心,不过后面没想到怎么处理和set的排序方法忘了- -,其实是和优先队列的仿函数一样的... 比赛后用set pair过了... #include <bits/stdc++.h&g ...

  4. http://codeforces.com/contest/610/problem/D

    D. Vika and Segments time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  5. http://codeforces.com/contest/612/problem/D

    D. The Union of k-Segments time limit per test 4 seconds memory limit per test 256 megabytes input s ...

  6. http://codeforces.com/contest/536/problem/B

    B. Tavas and Malekas time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  7. http://codeforces.com/contest/535/problem/C

    C. Tavas and Karafs time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  8. http://codeforces.com/contest/838/problem/A

    A. Binary Blocks time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  9. http://codeforces.com/contest/402/problem/E

    E. Strictly Positive Matrix time limit per test 1 second memory limit per test 256 megabytes input s ...

随机推荐

  1. mongodb基本使用(四)

    MongoDB 条件操作符 描述 条件操作符用于比较两个表达式并从mongoDB集合中获取数据. MongoDB中条件操作符有: (>) 大于 - $gt (<) 小于 - $lt (&g ...

  2. PSP Daily软件beta版本——基于spec评论

    题目要求: 每个小组评论其他小组beta发布作品的软件功能说明书. 试用(并截图)所有其他小组的beta作品,与软件功能说明书对比,评论beta作品对软件功能说明书的实现. 根据软件功能说明书,测试所 ...

  3. vue-router组件状态刷新消失的问题

    场景:vue-router实现的单页应用,登录页调用登录接口后,服务器返回用户信息,然后通过router.push({name: 'index', params: res.data})跳转到主页,并在 ...

  4. “吃神么,买神么”的第一个Sprint计划

    一.现状 我们这个团队刚接触网络网站的制作,前台后台的链接,数据库链接等还刚刚了解,在制作过程中药边学习边制作. 持着一个尽力做的心. 二.部分需求索引卡 主要的任务是把我们的主页面先大概做出来 三. ...

  5. 判断二叉树B是否是树A的子树

    如下图所示,则认为树B是树A的子树. 代码如下: /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode rig ...

  6. .Net用字符串拼接实现表格数据相同时合并单元格

    前言 最近在做项目通过GridView或Repeater绑定数据,如果两行或若干行某列值相同,需要进行合并单元格,但是实现过程中想到了字符串拼接,于是就没用绑定数据控件,而是用了html结合字符串实现 ...

  7. 打开ubuntu终端的两个方法【最快速】

    两种快捷方法: 1. ctrl+alt+T. 2. 桌面右击,再点击终端.

  8. 评论alpha发布

    第一组:新蜂小组 题目:俄罗斯方块 评论:很荣幸被邀请体验此游戏,感到加速下落时不是很灵敏,没有计分,页面不够美观(据说还在改善),整体框架已完成,基本功能已具备. 第二组:天天向上 题目:连连看 评 ...

  9. php aes加密

    <?php namespace Aes; error_reporting(E_ALL); ini_set('display_errors', '1'); class Aes { /** * va ...

  10. PHP 内置函数strlen 和mbstring扩展函数mb_strlen的区别

    #EXAMPLE $str_uncode = "简体中文Chinese(Simplified)"; //统计字符串长度 echo strlen($str_uncode).'< ...