n個熊孩子每個人有個數字a[i],首先k號熊孩子出圈,然後第k+a[i]個熊孩子出圈,乙個環,可以繞很多圈,如果a[i]為正則順時針數,反之逆時針,相當於乙個變體的約瑟夫遊戲,第i個出圈的熊孩子,有f[i]的得分,f[i]為i的因子個數
分為兩個部分:線段樹模擬約瑟夫遊戲+尋找1到n範圍內因數數量最多的那個ans,約瑟夫遊戲只要做到第ans個人出圈就好了
區間和的線段樹,每個葉子節點為1,代表乙個熊孩子,出圈置為0,
似乎搜到的題解都是打表來解決的因數個數問題,
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int n = 1e7 + 7;
const ll inf = ~0ll;
const int prime[16] = ;
struct child
}arr[n];
ll maxnum, anspos, n;
void dfs(int dep, ll tmp, int num)
if (num == maxnum && anspos > tmp) anspos = tmp;
for (int i = 1; i < 63; i++)
}struct segmenttree
inline int update(int
pos, int rt)
} t;
int main()
printf("%s
%lld\n", arr[pos].name, maxnum);
}return
0;}
poj 2886 線段樹 單點更新
題意 n個小孩圍成一圈,玩約瑟夫環,每個小孩有一張卡片上面是數字a,正數代表右手邊第a個小孩出隊,負數表示左手邊,遊戲從第k個小孩開始,遊戲直到所有小孩出隊為止,第p個出隊小孩得到f p 分數,f p 為p的因子數 題解 這裡引入反素數的概念不清楚可以看 每次詢問只要從第乙個出隊的執行到當前給出的n...
poj2886 線段樹單點更新)
到1號節點的距離為s的點,則該點的相對節點1的編號為 s n n 1,另外此題要打表求某個數的因子個數 反素數就是 對 x來說約束個數 g x 如果 對於 i includeusing namespace std const int maxn 500002 反素數及因子個數打表 int ap 40 ...
線段樹 單點修改
洛谷p3347 已知乙個數列,你需要進行下面兩種操作 1.將某乙個數加上x 2.求出某區間每乙個數的和 輸入格式 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含3個整數,表示乙個操作,具體如下...