假設到u
uu不超過d
dd的點的權值分解質因數的質數集合為p
pp,答案就是要求∑i=
1∣p∣
piki
\sum\limits_^ p_i^
i=1∑∣p
∣pi
ki
。這個很不好處理,考慮把乙個p
kp^k
pk拆成p ,p
2,p3
,⋯,p
kp,p^2,p^3,\cdots,p^k
p,p2,p
3,⋯,
pk中顏色,每種顏色的貢獻都為p
pp,那麼題目轉化成為到u
uu不超過d
dd的點中顏色至少出現一次的貢獻積。那麼就是經典問題了,可以對每種顏色維護dfs
dfsdf
s ep
u+
ddep_u+d
depu+
d的線段樹上查詢uuu
#include
#include
#include
#include
#include
#include
#define fo(i,j,k) for(int i=j;i<=k;++i)
#define fd(i,j,k) for(int i=j;i>=k;--i)
#define rep(i,x) for(int i=ls[x];i;i=nx[i])
using
namespace std;
typedef
long
long ll;
const
int n=
1e5+
10,m=
2e5+
10,s=
1e7+
10,mo=
998244353
;typedef multiset<
int>
:: iterator it;
int to[m]
,nx[m]
,ls[n]
,num=0;
void
link
(int u,
int v)
int bg[s]
,tt=
0,tot=0;
multiset<
int> cl[n*24]
;int l[n]
,r[n]
,f[n][17
],dep[n]
,z[n]
,n;vector<
int> dz[n]
;int a[n]
;int
qpow
(int x,
int y)
void
pre(
int x,
int fr)
intlca
(int u,
int v)
int pr[s/15]
,sm[s]
;int mx=0;
void
pre0()
}}int d[50]
;void
find
(int x)
int rt[n]
;void
mul(
int&x,
int y)
struct nodetr[n*
110]
;int be[n*
110]
;int now;
void
ins(
int x,
int t,
int&v,
int l=1,
int r=n)
mul(tr[v]
.s,t);if
(l==r)
return
;int mid=
(l+r)
>>1;
x<=mid?
ins(x,t,tr[v]
.l,l,mid)
:ins
(x,t,tr[v]
.r,mid+
1,r);}
intprod
(int x,
int y,
int v,
int l=1,
int r=n)
intget
(int x)
return bg[x];}
void
modify
(int t,
int cc,
int x)
void
add(
int x)
}int
main()
pre0()
,pre(1
,0),tot=0;
fo(i,
1,n) dz[dep[i]].
push_back
(i);
fo(i,
1,n)
int q,ans=0;
scanf
("%d"
,&q)
;for
(;q--;)
}
半平面交模板
妹的,一直沒有想清楚無解的情況到底是如何判斷的。偷來乙個模板。半平面交的結果 1.凸多邊形 後面會講解到 2.無界,因為有可能若干半平面沒有形成封閉3.直線,線段,點,空 屬於特殊情況吧 演算法 1 根據上圖可以知道,運用給出的多邊形每相鄰兩點形成一條直線來切割原有多邊形,如果多邊形上的點i在有向直...
模板 半平面交
考慮用射線 乙個點和乙個向量 表示它左側的半平面 那麼我們可以先按與x軸正半軸夾角 可用atan2 y,x 實現 排序,然後再用雙端佇列維護當前在交中的射線即可 之所以要用雙端佇列,是因為新插入乙個半平面時隊首和隊尾都有可能被彈出,而且要注意的是,要先彈隊尾再彈隊首 在最後,還要再用隊首的彈一些隊尾...
半平面交 板子
poj 2451 敲了個板子,比帶花樹稍微好一些,但是還是很麻煩.寫了點注釋 include include include define point vector const int n 2e4 10 struct vector vector double x,double y double an...