P4900 食堂(數學式子推導)

2021-10-09 21:52:26 字數 2279 閱讀 2392

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∑

i​ji

​−i=

1∑n​

j=1∑

i​⌊j

i​⌋前

項為i=

1∑n​

ij=1

∑i​i

nv(j

),兩次

字首和即

可得到後

項為i=

1∑n​

j=1∑

i​⌊j

i​⌋=

i=1∑

n​j=

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個人已經買...