简单来讲就是给你个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;
}