[BZOJ4869][Shoi2017]相逢是問候(廣義尤拉定理+線段樹)
阿新 • • 發佈:2018-11-10
Address
Solution
前置知識:廣義尤拉定理。
當
時:
而題目中的修改:
實際上是:
由於
不斷地變成
之多
次後會變成
,
所以一個位置最多被修改
之後就不會變。
所以,我們用線段樹維護區間和以及區間內所有位置被修改的最少次數,
修改時遍歷到葉子節點,如果遍歷到一個節點,這個節點被修改的次數達到了上限,就 return 掉。
這樣,每個葉子節點到根的路徑最多被修改
次。
我們需要對於每個
和
,預處理出:
(共
個
)
根據廣義尤拉定理,上式等於:
遞迴求解。
注意兩個細節:
(1)
的冪。注意到指數最多隻有
,所以可以預處理出
,
,一直到
的值,然後再處理
,
,
, …… 的值,則:
(2)注意當指數小於
則降冪時不能加上
。
複雜度
。
Code
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define For(i, a, b) for (i = a; i <= b; i++)
#define p2 p << 1
#define p3 p << 1 | 1
using namespace std;
inline int read()
{
int res = 0; bool bo = 0; char c;
while (((c = getchar()) < '0' || c > '9') && c != '-');
if (c == '-') bo = 1; else res = c - 48;
while ((c = getchar()) >= '0' && c <= '9')
res