B
核心思路:这题我们会发现其实n为奇数的时候是非常好处理的。主要是n为偶数。我们不能难发现,奇数其实就是偶数的扩展情况,这里其实主要有点比较难看出1 2 3这个的关系,但是我们可以套值,毕竟B题难不到那里去的。、
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
void solve()
{
int n;
cin >> n;
if ((n & 1) == 0)
{
for (int i = 1;i <= n-2;i++)
cout << 2 << " ";
cout << 1 << " " << 3 << endl;
}
else
{
for (int i = 0;i < n;i++)
cout << 7 << " ";
cout << endl;
}
}
int main()
{
int t;
cin >> t;
while (t--)
{
solve();
}
}
solve();
}
}
C
核心思路:这里其实我们发现大部分数都可以a[i]=i,但是有个比较难处理的点就是n应该放在哪里呢。我们通过模拟下可以发现,n一定是放在x的倍数上面,所以如果\(x|n\)不为整数,那么就一定没有解.我们会发现原先的a[x]应该放x,但是x已经放在1那里了,所以我们只能尽量放x的最小倍数。这个我们可以把这个倍数:\(d=\frac{n}{x}\).分解质因数,然后每次乘上我们分解的质因数,那个数组的下标也就是相应变化的..
#include<bits/stdc++.h>
using namespace std;
const int N = 1e7 + 10;
int a[N];
void solve()
{
int n, x;
cin >> n >> x;
if (n % x)
{
cout << -1 << endl;
return;
}
memset(a, 0, sizeof 0);
for (int i = 1;i <= n;i++)
a[i] = i;
a[1] = x;
a[n] = 1;
int dx = n / x;
int now = x;
for (int i = 2;i <= dx / i;i++)
{
while (dx % i == 0)
{
a[now] = i * now;
now = i * now;
dx /= i;
}
}
if (dx != 1)
a[now] = now * dx;
for (int i = 1;i <= n;i++)
cout << a[i] << " ";
cout << endl;
}
int main()
{
int t;
cin >> t;
while (t--)
{
solve();
}
}
D
核心思路:其实这个题目并不算难,既然可以开平方那就说明肯定是\(a*n^2\),我们可以取a=4,那么开根号就是2*n;我们可以假设\(a_1=5*n,a_n=3*n\),然后去构造中间的数。并且需要保证这两个数是最大值和最小值。
我们可以构造一下数列:
\(5*n,4*n-1,4*n-2\cdots,4*n+1,4*n+2,3*n\)
我们可以发现这样并不会超过我们的最大值和最小值,因为最大也只是\(4*n+\frac{n}{2}\).ok,上代码.
#include<bits/stdc++.h>
using namespace std;
const int N = 1e7 + 10;
int a[N];
void solve()
{
int n;
cin >> n;
a[1] = 5 * n;
for (int i = 1;i <= n;i++)
a[i] = 4 * n;
int t = n / 2;
int i = 1;
int j = 1;
for (i = 1;i <= t;i++, j++)
{
a[i] -= j;
}
i--;
if (n & 1)
i += 2;
else
i += 1;
for (j = 2;i <= n;i++, j++)
a[i] += j;
a[1] = 5 * n;
a[n] = 3 * n;
for (int i = 1;i <= n;i++)
cout << a[i] << " ";
cout << endl;
}
int main()
{
int t;
cin >> t;
while (t--)
{
solve();
}
}
标签:std,836,int,Codeforces,div2,solve,const,include,我们
From: https://www.cnblogs.com/xyh-hnust666/p/16931075.html