LuoguP1221 最多因子數

2022-05-18 01:13:07 字數 1330 閱讀 1907

求區間[l,r]內約數個數最多的數和它的約數個數。

這個題吧,乍一看確實不是很難,然後稍微一想,嗯,是個傻*題。這是唯一感受,不要問我為什麼。

首先我們定義乙個函式\(f(x)\)表示\(x\)的約數個數。題目要求求出\([l,r]\)中的\(f(x)max\)和這個數。首先最基本我們要知道每乙個數\(data[i]\)都乙個基本性質:

\(data[i] = prime_1^ \times prime_2^ \times ... \times prime_n^\),語言表示就是任意i乙個數都可以分解成多個質數的若干次方的乘積,稍微搞一搞我們得到\(f(x) = (m_1 + 1) \times (m_2 + 1) \times ...\times (m_n + 1)\)。

由此將搜尋的過程由質因數分解轉化為了質因數相乘,則搜尋的時候只需要搜尋質因數就可以了,然後記錄質因數的個數即可。當然,單純這樣搞是會\(t\)掉的,下面數一下剪枝:

按照遞增順序搜尋每乙個質數。

列舉質數的指數。如果當前列舉的質數算上指數的乘積為\(x\),下一次列舉的時候指數為\(y\),如果\(x \times y > r\),超過了區間的右端點,直接\(return​\)。這個是很顯而易見的。

如果當前的質數算上指數的乘積在\([l, r]\)之間,那麼代表它有可能更新答案,而\(r - l < x\)的時候,我們也直接\(return\),因為下一次搜尋一定搜不到\([l, r]\)之間的數,所以zhi直接跳出。

#include #include #include #include #include using namespace std ;

typedef long long ll ;

const int maxn = 500010 ;

const int maxm = 40000 ;

int l, r, ans, max, prime[maxn] ;

bool notp[maxn] ; int tot ;

inline void dfs(ll h, ll n, ll now) return ;

}int main()

for (int i = 2 ; i <= maxm ; i ++)

} if (r - l <= 10000) if (t > ans) ans = t, max = i ;

} }else dfs(1, 1, 1) ;

printf("between %d and %d, %d has a maximum of %d divisors.\n", l, r, max,ans);

return 0 ;

}

12 21學習計畫

1 修改課設的程式bug,畫流程圖,寫課設報告 2 去大活找老師得門禁的表,去監控室對照始終系統的誤差,確定是哪乙個同學。3 寫數電實驗報告啦 1 關於這個課設吧,寫程式的過程很是艱辛,除錯過程更是測了很多組的資料,接下來就說一下除錯程式的過程中遇到的問題。1.我是先搭建起乙個框架,沒有具體寫模組的...

12 21日 劉陽陽

1.寫乙個函式返回引數值為 1的個數 比如 15 0000 1111 4個1。自己想法 include int fuc int n while i 0 for i 0 i 8 i return count int main 改進後 int fuc int n return count int mai...

1221 單詞統計問題

1221 單詞統計問題 description 巨硬公司 huge hard 最近計畫出品乙個字處理軟體。軟體基本功能已經完成,但還缺少乙個單詞統計的功能,你的任務就是為該公司寫一段程式,完成統計功能。需要統計的資訊有兩項 出現單詞的個數和單個單詞出現的次數。input 輸入為一行字串,即要統計的文...