A Permutation
题意;
给一个质数 p p p,求一个 1 1 1 ~ p − 1 p-1 p−1的排列,满足 x i + 1 ≡ 2 x i ( m o d p ) x_{i+1}≡2x_i( mod p) xi+1≡2xi(modp) o r or or x i + 1 ≡ 3 x i ( m o d p ) x_{i+1}≡3x_i(mod p) xi+1≡3xi(modp)。
从 1 1 1 开始选,能选 2 2 2 的倍数就选 2 ∗ x % p 2∗x\%p 2∗x%p,能选 3 3 3 的倍数就选 3 ∗ x % p 3∗x\%p 3∗x%p,不能选就输出 − 1 −1 −1 就行。
AC代码:
const int N = 1e6 + 10;
int vis[N] = {0};
int main()
{
int t;
sd(t);
while (t--)
{
vector<int> ans;
int n;
sd(n);
rep(i, 1, n)
vis[i] = 0;
ans.pb(1), vis[1] = 1;
int bas = 1;
rep(i, 2, n - 1)
{
if (vis[2 * bas % n] == 0)
{
bas = 2 * bas % n;
vis[bas] = 1;
ans.pb(bas);
}
else if (vis[3 * bas % n] == 0)
{
bas = 3 * bas % n;
vis[bas] = 1;
ans.pb(bas);
}
}
if (ans.size() == n - 1)
{
rep(i, 0, n - 2)
printf("%d ", ans[i]);
printf("\n");
}
else
puts("-1");
}
return 0;
}
E Game
题意;
给你 n n n 列小方块,其中每列小方块有 a [ i ] a[i] a[i] 个,你可以选择任意位置从右往左推动小方块,如果此位置左边和上边也有小方块,它们会跟着一起移动,小方块移动后悬空就会落到下面的小方块上。移动到列 1 1 1 就不能移动了。
问若干次操作之后小方块的高度最大值的最小值 m a x i = 1 n b i max_{i=1}^nb_i maxi=1nbi。
最终高度是从左边往右边递减,而右边比左边高的地方是可以推过去的,然后就记录前缀和,求每个位置的平均值并且取最大就行了。
AC代码:
const int N = 1e5 + 10;
int n, a[N];
ll sum, ans;
int main()
{
int t;
sd(t);
while (t--)
{
sd(n);
sum = ans = 0;
ll res;
rep(i, 1, n)
{
sd(a[i]);
sum += a[i];
res = (sum + i - 1) / i;
ans = max(ans, res);
}
pld(ans);
}
return 0;
}