對於任何正整數x,其約數的個數記作g(x)。例如g(1)=1、g(6)=4。
如果某個正整數x滿足:g(x)>g(i) 0現在給定乙個數n,你能求出不超過n的最大的反質數麼?
輸入格式:
乙個數n(1<=n<=2,000,000,000)。
輸出格式:
不超過n的最大的反質數。
輸入樣例#1:
1000
輸出樣例#1:
840
思路:
這道題實際上是求1~n中因數最多的數中最小的。
因為我們知道,任意乙個大於1的整數都可以拆分成多個質數(或質數的冪)相乘
所以我們可以用前幾個質數(10幾個就夠了【標籤的打表題應該就是在這裡打表了】)構建反素數。
為什麼是十幾個呢?我們看一下題目的資料範圍,乙個數n(1<=n<=2,000,000,000)。
【而前9個質數2*3*5*7*11*13*17*19*23*29=6,469,693,230>2,000,000,000】所以實際上只需要前10個質數就可以啦
那麼我們每個數s必然可以分解為s=2^x1+3^x2+...+p^xn(p仍舊為質數)
因數的總數cnt=(x1+1)*(x2+1)*(x3+1)*……
我去網上找了個證明:
我們需要構建其中因數最多的。因數最多的若有多個則取最小的其中乙個並且輸出。
但是x1,x2,x3這樣的的數怎麼列舉呢?
我們不難發現,x1,x2,x3是嚴格不上公升的。為什麼呢?
證明:若存在兩個數,a^x1+b^x2,和a^x2+b^x1。ax2。兩個數的因數個數相同,但是第乙個比較小,所以選擇第乙個。
所以我們這題就大概這麼結束了!
#include#includeusing namespace std;
int prime[13]=,used[15];
long long n,best,ans=10000000000,pow[13][40],times=0;
void maketable() }}
void dfs(int now,long long num,long long a)
for(i=1;i<=used[now-1];i++)
}int main()
used[0]=i-1;
dfs(1,1,1);
cout
}
洛谷 P1463 SDOI2005 反素數ant
題目描述 對於任何正整數x,其約數的個數記作g x 例如g 1 1 g 6 4。如果某個正整數x滿足 g x g i 0 i x,則稱x為反質數。例如,整數1,2,4,6等都是反質數。現在給定乙個數n,你能求出不超過n的最大的反質數麼?輸入輸出格式 輸入格式 乙個數n 1 n 2,000,000,0...
SDOI2005 區間 解題報告
傳送門 現給定n個閉區間 ai,bi 1 i n。這些區間的並可以表示為一些不相交的閉區間的並。你的任務就是在這些表示方式中找出包含最少區間的方案。你的輸出應該按照區間的公升序排列。這裡如果說兩個區間 a,b 和 c,d 是按照公升序排列的,那麼我們有a b請寫乙個程式 讀入這些區間 計算滿足給定條...
洛谷P1463 反素數
對於任何正整數x,其約數的個數記作g x 例如g 1 1 g 6 4。如果某個正整數x滿足 g x g i 0現在給定乙個數n,你能求出不超過n的最大的反質數麼?乙個數n 1 n 2,000,000,000 不超過n的最大的反質數。輸入 1 1000輸出 1 840思路 菜雞第一次學習反素數,碼點字...