解方程,51nod1477,不明公式證明演算法複雜度

2021-10-10 20:44:02 字數 2365 閱讀 6366

非常的amazing啊!

想了一下午發現直接做就可以ac。

至今不知道怎麼證明複雜度,也問了很多巨佬,綠色夾克衫太忙了/kel

發現這個j(x

)=(p

1a1+

1)(p

2a2+

1)..

.(pk

ak+1

)j(x)=(p_1^+1)(p_2^+1)...(p_k^+1)

j(x)=(

p1a1

​​+1

)(p2

a2​​

+1).

..(p

kak​

​+1)

。我們要知道有多少個j(x

)=

aj(x)=a

j(x)=a

直接d pdp

dp即可,發現1012

10^10

12內的最多數的約數並不是很多的,dp陣列可以使用has

htab

le

hash\ table

hashta

ble來優化,不多於7000

7000

7000

個,我們可以使用什麼數來轉移呢?

這個數顯然是a

aa的乙個約數,列舉這個約數,−1-1

−1之後進行質因數分解就行了。

時間複雜度是o(∑

d∣ad

ln⁡d+

∑d∣a

∑g∣d

1)

o(\sum_\frac+\sum_\sum_ 1)

o(∑d∣a

​lndd

​​+∑

d∣a​

∑g∣d

​1)第乙個∑

\sum

∑是求可轉移數的複雜度,第二個∑

\sum

∑ 是求轉移的複雜度。

當然同乙個質因子的多個轉移數要同時轉移,要麼就亂了。

#include

using

namespace std;

const

int n=

1000010

;bool vis[n]

;int p[n]

,n,t,dt,l=

1,r;

long

long a;

pair<

long

long

,long

long

> a[n]

,d[n]

;const

int mod=

999997

;struct hash

key[

++tot]

=x;val[tot]

=t;nex[tot]

=first[tmp]

;first[tmp]

=tot;

}long

longgs(

long

long x)

}ha;

void

ins(

long

long x)

if(x!=1)

if(op==0)

return

; a[

++t]

.first=op;a[t]

.second=tmp;

}void

dfs(

int x,

long

long t)

long

long tmp=d[x]

.second;

while

(tmp)

}int

main()

}scanf

("%lld"

,&a);if

(a==1)

for(

int i=1;

1ll*i*i<=a;i++)if

(a%i==0)

long

long tmp=a;

for(

int i=

1;i<=p[0]

&&1ll

*p[i]

*p[i]

<=a;i++)if

(a%p[i]==0

)if(a!=

1) d[

++dt]

.first=d[dt]

.second=a;

sort

(a+1

,a+1

+t);

ha.ad(

1,1)

;while

(l<=t)

printf

("%lld\n"

,ha.

gs(tmp));

}

51nod 貪心入門

有若干個活動,第i個開始時間和結束時間是 si,fi 活動之間不能交疊,要把活動都安排完,至少需要幾個教室?分析 能否按照之一問題的解法,每個教室安排盡可能多的活動,即按結束時間排序,再貪心選擇不衝突的活動,安排乙個教室之後,剩餘的活動再分配乙個教室,繼續貪心選擇 反例 a 1,2 b 1,4 c ...

51nod 迷宮問題

1459 迷宮遊戲 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 你來到乙個迷宮前。該迷宮由若干個房間組成,每個房間都有乙個得分,第一次進入這個房間,你就可以得到這個分數。還有若干雙向道路鏈結這些房間,你沿著這些道路從乙個房間走到另外乙個房間需要一些時間。遊戲規定了你的...

51nod 硬幣遊戲

有乙個簡單但是很有趣的遊戲。在這個遊戲中有乙個硬幣還有一張桌子,這張桌子上有很多平行線 如下圖所示 兩條相鄰平行線之間的距離是1,硬幣的半徑是r,然後我們來拋硬幣到桌子上,拋下之後硬幣有時候會和一些直線相交 相切的情況也算是相交 有時候不會。請你來計算一下拋一次硬幣之後,該硬幣和直線相交數目的期望。...