題意:
如果乙個數 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的結果都是指數 對指數取模不能直接取...