題目鏈接
把操作存下來,由於只有50個操作,所以每次把操作逆回去運行一遍,就能求出在原來的數列中的位置,輸出即可
代碼:
#include#include #include using namespace std; typedef long long ll; const int N = 100005; const ll MOD = 1000000007; int t, n, m, c; ll a[N]; int op[N], on; char str[3]; ll pow_mod(ll x, ll k) { ll ans = 1; while (k) { if (k&1) ans = ans * x % MOD; x = x * x % MOD; k >>= 1; } return ans; } ll solve(int c) { ll mul = 1; for (int i = on - 1; i >= 0; i--) { if (op[i] == 1) { if (c > (n + 1) / 2) c = (c - (n + 1) / 2) * 2; else c = (c - 1) * 2 + 1; } else if (op[i] == 2) c = n - c + 1; else mul = mul * 2 % (MOD - 1); } return pow_mod(a[c], mul); } int main() { scanf("%d", &t); while (t--) { on = 0; scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) a[i] = i; while (m--) { scanf("%s%d", str, &c); if (str[0] == 'O') op[on++] = c; else printf("%lld\n", solve(c)); } } return 0; }