時間限制:
1000 ms | 記憶體限制:
65535 kb
難度: 2 描述
greyants最近正在學習數論中的素數,但是現在他遇到了乙個難題:給定乙個整數n,要求我們求出n的最大素因子的序數,例如:2的序數是1,3的序數是2,5的序數是3,以此類推. 研究數論是需要很大的耐心的,為了懲罰那些沒有耐心讀完題目的童鞋,我們規定:1的最大素因子序數是0.
輸入有多組測試資料,每一行輸入乙個數字n.(0輸出
在接下來的一行,輸出結果.
樣例輸入
234樣例輸出5
121這道題可把我坑慘了,看著感覺很簡單,但是一寫就容易tle~~~還是來說說比較快捷的思路吧。這個思路是根據篩法改造而來。先從2開始,然後將2標記為第乙個素數(即將最大素因子序數標為1),接著將2的倍數的最大素因子序數都標為1。然後再到3,將其最大素因子序數標為2,接著將3的倍數的最大素因子序數都標為2(注意,比如6,先前我們已經將其的最大素因子序數標為1,這時又發現6的乙個因子3序數比2的大,所以直接將前面的序數覆蓋掉)。再到4,由於4已經有了序數了(即被篩選過了),跳過。再到5,……一直到1000000。有了這張表,不管來什麼資料我都能一口報出答案(當然不能超過1000000)。3
下面是我的**(說多了都是淚,來之不易!)
#include #define max_size 1000000
void init(int prime)
k++;}}
}int main()
; init(prime);
while((scanf("%d",&n))!=eof)
return 0;
}
回頭再來看標程,發現標程的**有些複雜了。
#include#include#include#includeusing namespace std;
#define max 1000005
bool flag[max];
int res[max],prime[1005],cnt[max];
void init()
} for(int i = 2;i < 1000003;++i)
if(!flag[i]) res[i] = cnt[i] = cnt[i-1] + 1;
else cnt[i] = cnt[i-1];
}int judge(int i)
res[i] = res[x];
} return res[i];
}int ssca(int n)
}int main()
return 0;
}
乍一看,就感覺十分複雜,算了,還是不仔細琢磨了。
NYOJ 520 最大素因子
時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 greyants最近正在學習數論中的素數,但是現在他遇到了乙個難題 給定乙個整數n,要求我們求出n的最大素因子的序數,例如 2的序數是1,3的序數是2,5的序數是3,以此類推.研究數論是需要很大的耐心的,為了懲罰那些沒有耐心讀完...
NYOJ 520 最大素因子 快速線性篩法的變形
時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 greyants最近正在學習數論中的素數,但是現在他遇到了乙個難題 給定乙個整數n,要求我們求出n的最大素因子的序數,例如 2的序數是1,3的序數是2,5的序數是3,以此類推.研究數論是需要很大的耐心的,為了懲罰那些沒有耐心讀完...
NYOJ 458 解題報告
時間限制 1000 ms 記憶體限制 65535 kb 難度 1 描述 最近topcoder的xd遇到了乙個難題,倘若乙個數的三次方的後三位是111,他把這樣的數稱為小光棍數。他已經知道了第乙個小光棍數是471,471的三次方是104487111,現在他想知道第m m 10000000000 個小光...