Reward the Troop(uvalive 7465)(找规律)

该问题要求在m层满n叉树中进行节点标号,使得节点与其上下两层及同级兄弟节点的标号不同。通过观察规律,发现只需关注下面两层的标号即可。例如,在二叉树中,从第四层开始,每层的节点标号依次为上一层的下一个未出现过的数字。这种策略同样适用于更高叉数的树。解题关键在于寻找并利用此规律。
摘要由CSDN通过智能技术生成

原题链接

简单来讲就是给你个m层的满n叉树标号,要求一个节点的上下两层不能有和他一样的,同时他的亲兄弟不能和他一样,问最少的标号和

最开始写的时候理解错题意以为全部都不能一样就不停的错。。。。后来用google重新看了一遍题emmmmmm

就找规律就好了 一个  n叉树    其实每次不用考虑上下两层就光考虑下面两层就行了

举个例子 :当他是二叉树的时候,前三层就是题中给的不会有重的,但是当他到第4层的时候,4的同级是5但是第四层不是6了是1,因为1不在下两层出现过,继续第五层的时候,第四层的同级却不能是2或3,因为在下两层有这几个数所以继续往上找6,第五层因为下面没有2,3出现所以是2,第六层4又出现了 所以就循环找到规律了。

当他是3叉或4叉的时候同理。

多写几组

代码 很丑

#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cmath>
#include <stack>
#include <map>
#include <queue>
#define mod 10000000
using namespace std;
typedef long long LL;
LL sum[1050], a, b, c, d, n, m, i, j, ans, op[1050], d1;
int main()
{
	scanf("%lld", &n);
	sum[1] = 1;
	op[1] = 1;
	for (i = 2; i <= 1005; i++)
	{
		sum[i] = (sum[i - 1] + i) % mod;
		switch (i % 3)
		{
		case 1:
		case 2:
			op[i] = op[i - 1] + i % 3;
			break;
		case 0:
			op[i] = op[i - 1] + 3;
		}
		op[i] %= mod;
	}
	while (n--)
	{
		scanf("%lld%lld", &a, &b);
		if (b == 1)
		{
			printf("%lld\n", op[a] % mod);
		}
		else
		{
			for (i = 1; i <= 3 && i <= a; i++)
			{
				if (i == 1)
					ans = 1, d = 1;
				else
				{
					if (i == 2)
						ans = sum[b + 1], d = b + 1;
					else
					{
						if (i % 2 == 1)
							ans = (((ans % mod) * (b % mod)) % mod + (d + 1) % mod) % mod, d += 1;
						else
						{
							ans = (((ans % mod) * (b) % mod) % mod + ((sum[b - 1] + d) % mod + b) % mod) % mod, d += b;
						}
					}
				}
				ans %= mod;
				d %= mod;
			}
			d = a + 2;
			d1 = d + b;
			for (i; i <= a; i++)
			{
				ans = (ans * b) % mod;
				switch ((i-1) % 3)
				{
				case 1:
					ans += (d1 * b) % mod;
					ans %= mod;
					ans += sum[b - 2] % mod;
					ans += 2;
					break;
				case 2:
					ans += (sum[b - 1]) % mod;
					ans %= mod;
					ans += d % mod;
					ans %= mod;
					break;
				case 0:
					ans += (sum[b - 1]) % mod;
					ans %= mod;
					ans += 1;
					ans %= mod;
					break;
				}
			}
			printf("%lld\n", ans % mod);
		}
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值