洛谷P4161 遊戲

2022-06-13 22:57:10 字數 1194 閱讀 4928

給出 \(n\),令 \(nxt_x\) 表示 \(x\) 對應的數字。一開始有乙個 \(1\sim n\) 的遞增排列,每次數字 \(x\) 會變成 \(nxt_x\)。如此反覆直到該序列再次變回 \(1\sim n\) 的遞增排列。設迴圈了 \(k\) 次,你需要求出在 \(nxt\) 各不相同的情況下,\(k\) 有多少種取值。也就是說 \(nxt\) 有 \(n!\) 種方案,對於每一種方案都能求得乙個 \(k\)。

\(n\leq 1000\)。

我們把每乙個數字看做乙個點,點 \(x\) 向 \(nxt_x\) 連一條有向邊。顯然我們得到了若干個環,假設有 \(m\) 個環。

設環的大小(邊的數量)分別為 \(a_1,a_2,...,a_m\),那麼顯然對於這一組 \(nxt\),迴圈 \(\operatorname(a_1,a_2,...,a_m)\) 次就回到了初始狀態。

也就是說,我們要求

\[\sum^_[\exists(\operatorname(a_1,a_2,...a_m)=i\texttt\sum^_a_j=n)]

\]考慮乙個數 \(p\) 能否被表達出來。將 \(p\) 分解質因數得 \(p=k_1^·k_2^·...·k_m^\),如果 \(\sum^_k_i^\leq n\),那麼 \(p\) 就可以被表達出來。因為這樣的話,我們就可以從 \(n\) 個點中分別選出 \(k_1^,k_2^...k_m^\) 個點來圍成環,剩餘的點全部自環即可。

考慮到 \(n\) 較小,所以我們可以列舉 \(n\),假設有 \(n\) 個點拿出來連成環,剩餘的點自環,對於每乙個 \(n\) 分別計算即可。因為列舉的質數兩兩互質,所以 \(\operatorname\) 就是這些質數的乘積。

所以答案就是

\[\sum^_(\texttt)

\]這就是乙個揹包。

時間複雜度 \(o(n^2)\)。

#include #include #include using namespace std;

typedef long long ll;

const int n=1010;

int n,m;

ll ans,f[n];

int main()

for (int i=0;i<=n;i++)

ans+=f[i];

printf("%lld",ans);

return 0;

}

洛谷 P1057 傳球遊戲

題目描述 上體育課的時候,小蠻的老師經常帶著同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。遊戲規則是這樣的 n個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的乙個 左右任意 當老師在此吹哨子時,傳球停止,此時,拿著球沒有傳出...

洛谷 P1057 傳球遊戲

題目描述 上體育課的時候,小蠻的老師經常帶著同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。遊戲規則是這樣的 n個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的乙個 左右任意 當老師在此吹哨子時,傳球停止,此時,拿著球沒有傳出...

P1057 傳球遊戲 洛谷

上體育課的時候,小蠻的老師經常帶著同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。遊戲規則是這樣的 n個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的乙個 左右任意 當老師在此吹哨子時,傳球停止,此時,拿著球沒有傳出去的那個同...