非常的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
lnd+
∑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,然後我們來拋硬幣到桌子上,拋下之後硬幣有時候會和一些直線相交 相切的情況也算是相交 有時候不會。請你來計算一下拋一次硬幣之後,該硬幣和直線相交數目的期望。...