把乙個數的約數個數定義為該數的複雜程度,給出乙個n,求1-n中複雜程度最高的那個數。
例如:12的約數為:1 2 3 4 6 12,共6個數,所以12的複雜程度是6。如果有多個數複雜度相等,輸出最小的。
input
第1行:乙個數t,表示後面用作輸入測試的數的數量。(1 <= t <= 100)output第2 - t + 1行:t個數,表示需要計算的n。(1 <= n <= 10^18)
共t行,每行2個數用空格分開,第1個數是答案,第2個數是約數的數量。input示例
5110output示例1001000
10000
1 16 460 12
840 32
7560 64
題解:首先考慮約數。因為是約數,容易想到與素數,又因為每個數a =(p1^b1)*(p2^b2)*......(pn^bn)。所以乙個數的約數個數為(b1+1)*( b2 + 1)*......(bn+1)。然後又因為前16個素數的乘積大於1e18,故用搜尋,直接搜尋。當然這裡需要剪枝,因為考慮到約數個數盡量大而數的值盡量小,所以在相同約數個數情況下,較小的約數使用得多則數越小。即b1>=b2>=b3......>=bn。
**:
涉及知識點:#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
typedef long long ll;
typedef pairp;
const int inf = 0x3f3f3f3f;
const ll linf = 0x3f3f3f3f3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-10;
const int maxn = 1e5+7;
const int mod = 1e9+7;
int t;
ll n;
int p[16] = ;
ll ans1,ans2;
void dfs(ll now,ll cnt,int pos,int up)
}int main()
return 0;
}
反素數:對於任何正整數n,其約數個數記為f(n),例如f(6) = 4,如果某個正整數n滿足:對任意的正整數i(0
通俗的講,就是乙個數如果其約數個數大於小於它的所有數的約數個數,則這個數稱為反素數。
反素數的性質:
1、乙個反素數的所有質因子必然是從2開始的連續若干個質數,因為反素數是保證約數個數為x的這個數n盡量小。
2、同樣的道理,如果,n = (2^b1)*(3^b2)*(5^b3).....那麼必有b1>=b2>=b3>=......。
常見的有關問題有:
1、求約數為n的最小正整數x。
2、求n以內約數個數最多的較小正整數x。
這類問題多用搜尋解決,如果tle,考慮性質進行合理剪枝。
本題注意點:
if(now>n/p[pos]) break;
這個語句中的判斷語句如果改為now*p[pos]>n的話會錯,因為有可能乘法溢位。所以關於乘法,應該多注意,小心爆int,甚至longlong。
1060 最複雜的數 (反素數)
1060 最複雜的數 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 把乙個數的約數個數定義為該數的複雜程度,給出乙個n,求1 n中複雜程度最高的那個數。例如 12的約數為 1 2 3 4 6 12,共6個數,所以12的複雜程度是6。如果有多個數複雜度相等,輸出最...
51Nod 1060 最複雜的數
把乙個數的約數個數定義為該數的複雜程度,給出乙個n,求1 n中複雜程度最高的那個數。例如 12的約數為 1 2 3 4 6 12,共6個數,所以12的複雜程度是6。如果有多個數複雜度相等,輸出最小的。input 第1行 乙個數t,表示後面用作輸入測試的數的數量。1 t 100 第2 t 1行 t個數...
51nod 1060 最複雜的數
1060 最複雜的數 ural 1748 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 把乙個數的約數個數定義為該數的複雜程度,給出乙個n,求1 n中複雜程度最高的那個數。例如 12的約數為 1 2 3 4 6 12,共6個數,所以12的複雜程度是6。如果有多個...