數論雜記 約數個數定理

2022-07-19 22:45:23 字數 1698 閱讀 6627

例題:codeforces 1325e

1. 題目解釋每個數的因數個數不超過7個,說明了每個數最多只有2個質因數,因為如果有3個質因數的話,那麼 f(n)=(1+1)^3=8>7不成立了。

2. 求出的答案要使得乘積為完全平方,因此答案的質因數個數必須為偶數個,即a1、a2……要為偶數。

3. 答案的質因數個數必須為偶數個,等價於選最少的數,使乘積包含的質因子冪次都為 2。如果乙個數本身的質因數個數都為偶數,則直接輸出1即可,如果沒有這樣的數,我們可以考慮嘗試把每個數的質因數湊在一起,使得質因數個數都為偶數,這樣也可以求出答案,如果連湊都湊不出來,則輸出-1.

4. 考慮嘗試把每個數湊起來的方法比較巧妙,我們建立乙個無向圖,每個點代表了乙個質因子,如果某個數有兩個獨立的質因子,也就是說只有這兩個質因數湊不了偶數,那麼我們就把這兩個數連一條邊,說明這兩個數的個數都為1(入度為1),這有什麼用呢?考慮無向圖的性質,如果每個點的入度為 2,所以邊對應的數的乘積每個質因子冪次都為 2,這就要讓我們找出無向圖中所存在的最小環。

這題數論與圖論的結合十分巧妙,所以我們要有充足的前備知識才能做得出這道題目。

#include #define mp make_pair

using

namespace

std;

typedef

long

long

ll;inline

int read()

while(ch>='

0'&&ch<='

9') s=s*10+ch-'

0',ch=getchar();

return s*w;}

const

int maxn = 1000005

;const

int inf = 0x3f3f3f3f

;int

ip[maxn],i,n,p[maxn],cnt,dis[maxn],a[maxn],ans;

bool

vis[maxn];

vector

g[maxn];

void

get_prime()

for (int j=1;j<=cnt && i*p[j]<=maxn;j++)

}}void add(int x,int

y)void div(int

x) }

}if (x>1

)

if (num==0) puts("

1"),exit(0

);

else

if(num==1) add(1,div[1

]);

else add(div[1],div[2

]);}

int bfs(int

x) q.pop();

}return

inf;

}int

main()

ans=inf;

for (i=1;i<=1000;i++)

if (ans==inf) cout<

<

else cout

return0;

}

view code

7'>7

數論 約數個數

這題是個大水題,只不過資料稍微大了點。結果大家都用那啥的模擬。結果哈哈哈哈哈哈。求a b之間每個數的約數個數的總和。input 一行兩個正整數a b,以乙個空格隔開。output 一行乙個整數,即答案。資料範圍 對於50 的資料,1 a b 1000 對於100 的資料,1 a b 10,000,0...

約數個數定理

編輯 對於乙個大於1正整數n可以 分解質因數 則n的 正約數的個數就是 其中a 1 a2 a 3 ak是p 1 p2 p 3,p k的指數。編輯首先同上,n可以 分解質因數 n p1 a1 p2 a2 p3 a3 pk ak,由約數定義可知p1 a1的約數有 p1 0,p1 1,p1 2.p1 a1...

約數個數定理and約數和定理

定理 對於乙個大於1正整數n可以 分解質因數 則n的正約數 的個數就是 證明 省略 舉個栗子 例題 正整數378000共有多少個 正約數?解 將378000 分解質因數378000 2 4 3 3 5 3 7 1 由約數個數定理可知378000共有正約數 4 1 3 1 3 1 1 1 160個。c...