---
# System prepended metadata

title: Trans Solution
tags: [CP]

---

---
author: nguyencter
tags: Trans 
title: Trans Solution
---

$\Huge\text{Trans Solution}$

-------

:::info
🔗 Links: [Đề bài](https://drive.google.com/file/d/1EDCLctPhuW3Nnz2dGrvbtbIdIseOB5Yv/view?usp=sharing)
📌 Tags: `dp`   
✍️ Writer: nguyencter  
📋 Content:
[TOC]
:::

-----

## Giới Thiệu Đề Bài

![](https://i.imgur.com/KIjamDJ.png)


-----

## Thuật toán

Ta có nhận xét : số phép biến đổi $a$ thành $b$ $=$ (số phép biến đổi từ $gcd(a,b)$ thành $a$)$+$(số phép biến đổi từ $gcd(a,b)$ thành $b$).

Gán $a'=a/gcd(a,b)$ và $b'=b/gcd(a,b)$

Ta thấy số phép biến đổi $a$ thành $b$ bằng số phép biến đổi $a'$ thành $b'$ nên ta chỉ cần tìm số phép biến đổi $a'$ thành $b'$ là được.

Để tính số phép biến đổi từ $1$ đến $a'$ ta sử dụng phương pháp quy hoạch động.

Gọi mảng $f$ gồm $k$ phần tử là mảng chứa các ước số của $a'$ được sắp xếp tăng dần.

Gọi $dp[i]$ là số phép biến đổi từ $1$ thành ước số lớn thứ $i$ của $a'$

Bài toán cơ sở: $dp[1]=0$.

$dp[i]=min(dp[j])+1$ với $j<i,$ $f[i]$ % $f[j]=0,f[i]/f[j] \leq d$.

Gọi $dp'[i]$ là số phép biến đổi từ $1$ thành ước số lớn thứ $i$ của $b'$

Mảng $dp'$ tính toán tương tự mảng $dp$.

Kết quả bài toán là $dp[k]+dp'[k'].$

Vì số lượng ước lớn nhất của $a'$ và $b'$ không quá 2000 nên độ phức tạp của thuật toán trên là khoảng $O(2000^2)$.

----

Tham khảo code ở [đây](https://github.com/nguyencter/CODE/blob/main/bwpoints.cpp)