就大概说的是一个将军要给部下发勋章,他的部下以和别人不一样的勋章为荣,但是他没这么多钱,所以问你最少要多少钱
要求是每个人的上司是他的上两级,他的下两级是他的部下,每个人的勋章不能和他的上司和部下的勋章一样,也不能和他同源的同等级军人一样。
最开始写的时候理解错题意以为全部部下都不能一样就不停的错。。。。后来用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; }