2015 acm taipei L-Reward the Troop(uvalive 7465)(找规律)

原题链接

就大概说的是一个将军要给部下发勋章,他的部下以和别人不一样的勋章为荣,但是他没这么多钱,所以问你最少要多少钱

要求是每个人的上司是他的上两级,他的下两级是他的部下,每个人的勋章不能和他的上司和部下的勋章一样,也不能和他同源的同等级军人一样。

最开始写的时候理解错题意以为全部部下都不能一样就不停的错。。。。后来用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;
}

猜你喜欢

转载自www.cnblogs.com/Zhh-acmer-Dream/p/10525601.html
今日推荐