給出 \(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個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的乙個 左右任意 當老師在此吹哨子時,傳球停止,此時,拿著球沒有傳出去的那個同...