由于一道题引发的猜想,求各路神犇证明(TAT)
  • 板块灌水区
  • 楼主SnapYust
  • 当前回复7
  • 已保存回复7
  • 发布时间2022/11/26 17:37
  • 上次更新2023/10/27 01:24:19
查看原帖
由于一道题引发的猜想,求各路神犇证明(TAT)
747475
SnapYust楼主2022/11/26 17:37

看到某个人出的一道题,让我写std来造数据。

题目:

绝对值

题目背景

这是 XX 在做校本作业时产生的灵感的一道题。

题目描述

XX 给你了 nn 个一次项,分别是 a1,a2,a3......ana_1, a_2, a_3......a_n,然后再进行字典序排列组合(暂时没想到别的说法,但应该能理解),就是说,如果 n=3n=3,那么这些排列组合就是 a1,a2,a3,a1a2,a1a3,a2a3,a1a2a3a_1, a_2, a_3, a_1a_2, a_1a_3, a_2a_3,a_1a_2a_3,XX 把他们加了个绝对值,然后在除以自己,如 a1a1\frac{|a_1|}{a_1},将所有进行此操作的数的和记作 S(n)S(n)

例子:n=2n = 2 时,S(n)=a1a1+a2a2+a1a2a1a2S(n) = \frac{|a_1|}{a_1} + \frac{|a_2|}{a_2} + \frac{|a_1a_2|}{a_1a_2}

给你数字 nn,求 S(n)S(n) 有几种情况。

输入格式

一行一个正整数 nn

输出格式

一行一个正整数,如题所示。

样例 #1

样例输入 #1

2

样例输出 #1

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;
}

但我发现,不管 nn 为多少,答案一定为 22

我数学不好,所以:

求证明!!!

2022/11/26 17:37
加载中...