看到某个人出的一道题,让我写std来造数据。
题目:
这是 XX 在做校本作业时产生的灵感的一道题。
XX 给你了 n 个一次项,分别是 a1,a2,a3......an,然后再进行字典序排列组合(暂时没想到别的说法,但应该能理解),就是说,如果 n=3,那么这些排列组合就是 a1,a2,a3,a1a2,a1a3,a2a3,a1a2a3,XX 把他们加了个绝对值,然后在除以自己,如 a1∣a1∣,将所有进行此操作的数的和记作 S(n)。
例子:n=2 时,S(n)=a1∣a1∣+a2∣a2∣+a1a2∣a1a2∣。
给你数字 n,求 S(n) 有几种情况。
一行一个正整数 n。
一行一个正整数,如题所示。
2
2
然后这道题的代码写出来了:
#include <bits/stdc++.h>
using namespace std;
int a[100];
int b[100] = {0};
int n;
int ans = 0;
int p[1005] = {0};
int cnt = 0;
void solve(int k)
{
if (k > n)
{
int r = 114514;
int i;
for (i = 1; i <= n; i++)
{
if (b[i])
{
r = a[i];
break;
}
}
i++;
for (; i <= n; i++)
{
if (b[i])
{
r *= a[i];
}
}
if (r == 114514) return;
else
{
ans += r;
return;
}
}
for (int i = 1; i <= 2; i++)
{
if (i == 1)
{
b[k] = 1;
solve(k + 1);
}
else
{
b[k] = 0;
solve(k + 1);
}
}
}
void dfs(int k)
{
if (k > n)
{
for (int i = 1; i <= n; i++) cout << a[i] << ' ';
cout << endl;
memset(b, 0, sizeof(b));
ans = 0;
solve(1);
cout << ans << endl;
bool f = 1;
for (int i = 1; i <= cnt; i++)
{
if (p[i] == ans)
{
f = 0;
break;
}
}
if (f) p[++cnt] = ans;
return;
}
for (int i = 1; i <= 2; i++)
{
if (i == 1)
{
a[k] = 1;
dfs(k + 1);
}
else
{
a[k] = -1;
dfs(k + 1);
}
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n;
dfs(1);
cout << cnt << endl;
return 0;
}
但我发现,不管 n 为多少,答案一定为 2
我数学不好,所以: