1. 程式人生 > >Codeforces 286B Shifting (看題解)

Codeforces 286B Shifting (看題解)

開始 col https 整體 first turn nbsp force c++

Shifting

感覺這題被智力打擊了。。

剛開始我想的是對於每個位置我們可以暴力找出最後的位置在哪裏。

因為對於當前位置p, 在進行第x步操作時,

如果p % x == 1 則 p = p + x - 1

否則 p = p - 1

並且第一步只有nlogn次, 所以我們可以暴力找出p % x == 1的情況, 然後更新, 然後就被卡常惹。。

主要是存因子要2s鐘, 卡常卡一輩子卡不過去。

其實我們發現每一步操作只有兩種點, 一種p = p - 1, 另一種是 p = p + x - 1

那麽我們將p = p - 1的不移動, 相當於整體往前移動一格, 改變哪些 p = p + x - 1的, 這樣就可以了。。。。

#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PLL pair<LL, LL>
#define PLI pair<LL, int>
#define PII pair<int, int>
#define SZ(x) ((int)x.size())
#define ull unsigned long long

using namespace std;

const int N = 2e6 + 7; const int inf = 0x3f3f3f3f; const LL INF = 0x3f3f3f3f3f3f3f3f; const int mod = 1e9 + 7; const double eps = 1e-8; const double PI = acos(-1); int n, a[N]; int main() { scanf("%d", &n); for(int i = 1; i <= n; i++) a[i] = i; int L = 1, R = n; for
(int i = 2; i <= n; i++) { int p = n / i * i - 1 + L; a[R + 1] = a[p + 1]; while(p - i >= 0) { a[p + 1] = a[p - i + 1]; p -= i; } L++; R++; } for(int i = L; i <= R; i++) printf("%d ", a[i]); puts(""); return 0; } /* */

Codeforces 286B Shifting (看題解)