ans
=∑i=
1n∑j
=1ii
j−∑i
=1n∑
j=1i
⌊ij⌋
前項為∑
i=1n
i∑j=
1iin
v(j)
,兩次前
綴和即可
得到後項
為∑i=
1n∑j
=1i⌊
ij⌋=
∑i=1
n∑j=
1id(
j),n
logl
ogn+
2n即可
得到
ans = \sum_ ^ \sum_ ^ \frac - \sum_ ^ \sum_ ^ \lfloor\frac \rfloor\\ 前項為\sum_ ^i \sum_ ^ inv(j), 兩次字首和即可得到\\ 後項為\sum_ ^ \sum_ ^ \lfloor \frac \rfloor = \sum_ ^ \sum_ ^ d(j),nloglogn + 2n即可得到\\
ans=i=
1∑n
j=1∑
iji
−i=
1∑n
j=1∑
i⌊j
i⌋前
項為i=
1∑n
ij=1
∑ii
nv(j
),兩次
字首和即
可得到後
項為i=
1∑n
j=1∑
i⌊j
i⌋=
i=1∑
nj=
1∑i
d(j)
,nlo
glog
n+2n
即可得到
本來想瞎開題,沒想到又碰到數學題了
/*
*/#pragma gcc optimize(2)
#pragma gcc optimize(3)
#include
#define mp make_pair
#define pb push_back
#define endl '\n'
#define mid (l + r >> 1)
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
#define ls rt << 1
#define rs rt << 1 | 1
using
namespace std;
typedef
long
long ll;
typedef
unsigned
long
long ull;
typedef pair<
int,
int> pii;
const
double pi =
acos(-
1.0)
;const
double eps =
1e-7
;const
int inf =
0x3f3f3f3f
;inline ll read()
while
(c >=
'0'&& c <=
'9')
return f * x;
}const
int n =
1e6+
10, mod =
998244353
;ll quick_pow
(ll a,
int n)
return ans;
}ll prime[n]
, inv[n]
, f1[n]
, f2[n]
, cnt;
bool st[n]
;void
init()
for(
int j =
1; j <= cnt &&
1ll* i * prime[j]
< n; j++)}
}for
(int i =
1; i < n; i++)}
for(
int i =
1; i < n; i++
)for
(int i =
1; i < n; i++)}
intmain()
return0;
}
P2157 SDOI2009 學校食堂
傳送門 做菜主要是按時間順序,所以可以考慮dp 但是可能後面的人會先打飯 可以發現同學最多只能讓後面的第7個同學先打飯 可以從這裡入手考慮問題 把每8個一起的同學看成乙個狀態 在他們之前的人都已經打好飯了 想象乙個從左往右的佇列 從1 i 1 的同學都打完飯了 然後需要知道的狀態是 i i 7 共8...
P2157 SDOI2009 學校食堂
小f 的學校在城市的乙個偏僻角落,所有學生都只好在學校吃飯。學校有乙個食堂,雖然簡陋,但食堂大廚總能做出讓同學們滿意的菜餚。當然,不同的人口味也不一定相同,但每個人的口味都可以用乙個非負整數表示。由於人手不夠,食堂每次只能為乙個人做菜。做每道菜所需的時間是和前一道菜有關的,若前一道菜的對應的口味是a...
P2157 SDOI2009 學校食堂 狀壓DP
有點複雜,自行瀏覽吧 題目鏈結 我們發現dp轉移時需要記錄以下幾個資訊 打飯佇列的隊首是誰,上乙個打飯的是誰,佇列前b i b i b i 個人的狀態 然後我們根據這些資訊設立dp狀態,記f i j k f i j k f i j k 表示該第i ii個人打飯 等價於前i 1 i 1i 1個人已經買...