反素數求解 反素數打表

2021-09-06 05:26:08 字數 1193 閱讀 9406

問題描述:

對於任何正整數x,起約數的個數記做g(x).例如g(1)=1,g(6)=4.

如果某個正整數x滿足:對於任意i(0現在給乙個n,求出不超過n的最大的反素數.

比如:輸入1000 輸出 840

思維過程:

求[1..n]中約數在大的反素數-->求約數最多的數

如果求約數的個數 756=2^2*3^3*7^1

(2+1)*(3+1)*(1+1)=24

基於上述結論,給出演算法:按照質因數大小遞增順序搜尋每乙個質因子,列舉每乙個質因子

為了剪枝:

性質一:乙個反素數的質因子必然是從2開始連續的質數.

因為最多隻需要10個素數構造:2,3,5,7,11,13,17,19,23,29

性質二:p=2^t1*3^t2*5^t3*7^t4.....必然t1>=t2>=t3>=....

反素數求解函式:

#include #include #define ll long long

using namespace std;

const int inf = 999999999;

const int prime[16]= ;

int n;

ll bnum,bsum;

//當前列舉到的數;列舉到的第k大的質因子;該數的約數個數;質因子個數上限。

void getantiprime(ll num,ll k,ll sum,ll limit)

//如果約數個數相同,將最優解更新為較小的數。

if (bsum == sum && bnum > num) bnum = num;

if (k > 10) return ;

ll tmp = num;

//開始列舉每個質因子的個數。

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

}int main()

return 0;

}

反素數打表函式:

#include#include#include #define maxn 600000

using namespace std;

int dp[600001];

int main()

}int max=0;

for(i=2;i<=maxn;i++)

;int pnum = ;

python打反素數 反素數求解 反素數打表

問題描述 對於任何正整數x,起約數的個數記做g x 例如g 1 1,g 6 4.如果某個正整數x滿足 對於任意i 0 現在給乙個n,求出不超過n的最大的反素數.比如 輸入1000 輸出 840 思維過程 求 1.n 中約數在大的反素數 求約數最多的數 如果求約數的個數 756 2 2 3 3 7 1...

反素數求解 反素數打表

問題描述 對於任何正整數x,起約數的個數記做g x 例如g 1 1,g 6 4.如果某個正整數x滿足 對於任意i 0現在給乙個n,求出不超過n的最大的反素數.比如 輸入1000 輸出 840 思維過程 求 1.n 中約數在大的反素數 求約數最多的數 如果求約數的個數 756 2 2 3 3 7 1 ...

HDU 2521 反素數 打表

problem description 反素數就是滿足對於任意i 0 input 第一行輸入n,接下來n行測試資料 輸入包括a,b,1 a b 5000,表示閉區間 a,b output 輸出為乙個整數,為該區間因子最多的數.如果滿足條件有多個,則輸出其中最小的數.sample input 32 3...