模擬賽2 題解

2022-07-31 06:21:17 字數 1627 閱讀 7975

這次模擬賽最後一道是提答題,就不寫題解了。

orz這題……emmm,我無話可說。

小範圍記憶化,大範圍遞迴求解……複雜度 \(o(k\sqrt)\)。

記 \(f(i,j)\) 表示前 \(j\) 個數中不被 \(a_i,a_,\dots,a_n\) 整除的個數,答案即為 \(f(1,n)\)。狀態轉移方程為 \(f(i,j)=f(i+1,j)-f(i+1,j/a_i)\)。

轉移方程是個容斥,可以在小範圍內把式子展開理解一下。

#include using namespace std;

typedef long long ll;

const int n=105,m=2e5;

ll n;

int k,f[n][m+5],a[n];

ll f(int i,ll j)

int main()

神仙題啊啊啊啊啊

設 \(f(l,r)\) 表示從 \(l\) 開始走,不到 \(l-1\) 且走出 \(r\) 的概率(即不會遊戲失敗),\(g(l,r)\) 表示表示從 \(r\) 開始走,不到 \(r+1\) 且走出 \(l\) 的概率。現在我們用分治的方式來計算這個式子,又因為題目還帶了操作,容易想到用線段樹來維護。現在考慮合併兩個區間的 \(f_1=f(l,mid),f_2=f(mid+1,r),g_1=g(l,mid),g_2=g(mid+1,r)\)(還有 \(f(l,r)=f,g(l,r)=g\))。

\[f=f_1f_2+f_1(1-f_2)(1-g_1)f_2+f_1(1-f_2)^2(1-g_1)^2f_2+\dots

\]即直接走過去、轉一圈、轉兩圈、一直轉下去的情況之和。

發現後方是個等比數列,於是答案就是

\[f=f_1f_2\frac}=\frac

\]同理可得

\[g=\frac

\]特別地,\(f(l,l)=p_l,g(l,l)=g_l\)。

#include using namespace std;

const int n=1e5+5;

struct node

t[n<<2];

double p[n];

int n,q;

inline void pushup(int rt)

void build(int rt,int l,int r)

int mid=l+r>>1;

build(rt<<1,l,mid);

build(rt<<1|1,mid+1,r);

pushup(rt);

}void change(int rt,int pos,double val)

int mid=l(rt)+r(rt)>>1;

if(pos<=mid) change(rt<<1,pos,val);

else change(rt<<1|1,pos,val);

pushup(rt);

}node query(int rt,int l,int r)

; return ans;

}int main()

build(1,1,n);

while(q--)

else

}return 0;

}

模擬賽 circle 題解

題意 有n個數,問有多少個x,x leq t 滿足這n個數分別 x後,異或和為s。每個數小於 2 m 數字dp。由於是加法,需要記錄進製,因此從低位到高位dp。只要記錄下有幾個進製,就可以根據這n的數的大小知道究竟是哪幾個進製了。設 dp i,j,0 1 表示考慮到第i位,有j個進製,與t的大小關係...

2020 10 08 模擬賽 題解

期望100 實際100 老師說是結論題。其實可以直接打表,t i 表示0 63中有t i 對數與起來等於i,然後乘法原理即可。沒什麼難度。include include using namespace std const int maxn 100005 const int mod 1e9 7 cha...

2021 02 10 模擬賽題解

比較水,就不說了。就是暴力優化,不知道複雜度為哈對,也過不了,就不放了。考慮暴力,即每次每個點向可以一波傳染的點連邊,然後縮點,求無入度的點數即可。考慮優化,你發現對於兩個點可以在點分樹上乙個點考慮先走到該點再到另乙個點,所以我們可以直接澱粉質,然後雙指標拆點連邊即可。include using n...