You are on page 1of 3

Đề bài

https://thptchuyen.ntucoder.net/ckfinder/userfiles/files/Z
EROPATH.pdf
Link submit thì mình k bt
#include<bits/stdc++.h>

#define maxn 10004

#define el cout<<"\n"

using namespace std;

//vector<int>a[maxn];

int d[maxn];

void dfs(int u){

for(int x=1;x*x<=u;++x){

if(u%x==0){

int m=(x-1)*((u/x)+1);

if(!d[m]){

d[m]=1;

dfs(m);

int main(){

int n;

cin>>n;

set<int>ans;
for(int i=0;i<n;++i){

d[i]=0;

d[0]=1;

dfs(n);

for(int i=0;i<maxn;++i){

if(d[i]==1){

ans.insert(i);

}cout<<ans.size();el;

for(auto x:ans){

cout<<x<<" ";

Ý tưởng bài này mình đọc được từ 1 video của anh Yugihacker về dfs trên youtube

Nx: theo mình đánh giá đây giống 1 bài đệ quy bình thường thôi nhưng nếu suy nghĩ
theo kiểu đồ thị thì cũng dễ hiểu và dễ suy nghĩ

Đầu tiên sẽ suy nghĩ như có 1 đồ thị với các đỉnh là nghiệm của bài toán các cạnh là
các bước để có thể ra được các đỉnh(các đỉnh k có sẵn mà phải tự mình tìm ra)

Các bạn nên tư duy giống cái cây trên video của anh yugi nhé

S1:Đặt tất cả các đỉnh có thể là nghiệm là 0(nếu là nghiệm thì là 1 và lúc sau trace sau)

S2:đặt đỉnh 0 là 1 vì luôn có thể tạo số 0 từ 1 số nguyên

S3:dfs(u):
+giống như kiểm tra snt thì khi ta duyệt các ước chỉ đến sqrt(u) *hiểu đơn giản rằng
sqrt(u) là khoảng giữa các ước của u

*x là ước của u

+với y ta sẽ tìm thoong qua lấy u/x


+rồi tính m thông qua ct của đề bài cho

+đánh dấu đã có m thông qua d và tiếp tục tìm các nhiệm khác có thể tạo từ m và tiếp
tục đến khi nào m=0 thì quay lui lên và tìm các trường hợp khác

S4:Truy vết các bạn cứ chạy đến tối đa của n(1e4) chẳng sao

Truy vết từng số 1 trên mảng đánh dấu d

*bài này có lẽ mình 1 đấm ac

You might also like