SDOI2005 反素數ant 洛谷p1463

2021-08-04 16:30:57 字數 1283 閱讀 1828

對於任何正整數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思路 菜雞第一次學習反素數,碼點字...