數字轉換(dp 數論)

2021-10-03 09:53:04 字數 826 閱讀 7107

題意:

如果乙個數 x 的約數之和 y(不包括他本身)比他本身小,那麼 x 可以變成 y,y 也可以變成 x。

例如,4 可以變為 3,1 可以變為 7。

限定所有數字變換在不超過 n 的正整數範圍內進行,求不斷進行數字變換且不出現重複數字的最多變換步數。

思路:可以將每個數與能到達的數之間連一條邊,這樣就會形成乙個森林,而題目要求的就是在森林中找一棵樹的最大直徑。

問題轉換為求樹的最大直徑:

第一步:用篩法的變形求每個數的約數之和

第二部:(從滿足條件的樹根開始遍歷)dfs求數的最長路徑

**:

#include #include #include using namespace std;

const int n=50010,m=2*n;

int h[n],e[n],ne[m],idx;

int sum[n];

bool st[n]; //記錄樹根

int n;

int ans;

void add(int a,int b)

int dfs(int u)

ans=max(ans,d1+d2);

return d1;

}int main()

//遍歷樹根

for(int i=1;i<=n;i++)

if(!st[i])

dfs(i);

cout<

return 0;

}

花神的數論題 數字dp

題目描述 設 sum i 表示 i 的二進位制表示中 1 的個數。給出乙個正整數 n 花神要問你 prod nsum i 資料範圍 對於 100 的資料,n leq10 考慮每一位二進位制的拆解 include define mod ll 10000007 using namespace std t...

DP 樹形 DP 數字轉換

並不容易看出的模型 在n以內的數字和她們不包括自身的約數和 要求小於這個數本身 構成的森林中找到最長的樹的直徑。上述模型成立是因為每個數字的約數和 不包括自己,下同 是乙個定值,我們正好根據大小關係建立有向樹來進行dfs,根據樹的直徑求法,就可以得到結果了。include include inclu...

BZOJ 3209 花神的數論題 數字DP 數論

題目大意 令sum i 為i在二進位制下1的個數 求 1 i n sum i 一道很簡單的數字dp 首先我們打表打出組合數 然後利用數字dp統計出二進位制下1的個數為x的數的數量 最後輸出 1 x logn x ans x 即可 此題的坑在於這題的組合數和數字dp的結果都是指數 對指數取模不能直接取...