• Codeforces Round #652 (Div. 2)D. TediousLee 推导


    题意:

    Rooted Dead Bush (RDB) of level 1是只有一个点,如下图

    当(RDB) of level i变成(RDB) of level i+1的时候,每一个顶点要进行下面的变化:

    1、如果一个节点只有一个子节点,那么就再给这个节点添加两个子节点

    2、如果一个节点没有子节点,那么就给这个节点添加一个子节点

    3、如果一个节点有三个子节点,那么就不用管它

    你需要从(RDB) of level i中找到有多少爪,爪的结构如下

    最后因为我们求的是要给多少爪的节点染色,因为一个爪有四个节点,所以最后答案就是爪的个数乘于4(注意,爪与爪之间不能有重叠节点)

     对于(RDB) of level 3只有一个爪就是(1,3,2,4);对于(RDB) of level 4种有两个爪(1,3,2,4)和(2,7,5,6)但是两个爪有重叠部分,所以只能算作一个

    题解:

    衍生的过程是具有重复性的,最终变化的是根结点 1 下的三棵子树,左右两棵子树为 leveln-2,中间的子树为 leveln-1 。

    因为 level1 和 level2 的根结点并未使用,所以可以在 level3 中选择以根结点 1 为中心的爪形结构。

    同理,level4level5 可以通过选取较下层的爪形结构来避免根结点的使用,所以在 level6 中又可以选取以根结点 1 为中心的爪形结构。

    即,level为 3 的倍数的图形都可以再额外选取位于根结点的爪形结构。

    dp[i]=2*dp[i-2]+dp[i-1]+(i%3==0)*4

    代码:

     1 #include<iostream>
     2 using namespace std;
     3 #define ll long long
     4 const int maxn =( 2 * 1e6)+10;
     5 const int mod = 1e9 + 7;
     6 ll dp[maxn], i, t, n;
     7 
     8 void solve()
     9 {
    10     dp[0] = 0;
    11     dp[1] = 0;
    12     dp[2] = 0;
    13     for (int i = 3; i <maxn; i++)
    14     {
    15         dp[i] = (dp[i - 1] + 2 * dp[i - 2])%mod;
    16         if (i % 3 == 0)  
    17         {
    18             dp[i] += 4;
    19             dp[i] %= mod;
    20         }
    21     }
    22 }
    23 int main()
    24 {
    25     solve();
    26     int t;
    27     cin >> t;
    28     while (t--)
    29     {
    30         int n;
    31         cin >> n;
    32         cout << dp[n] << endl;
    33     }
    34 }
  • 相关阅读:
    iOS应用程序间共享数据(转)
    解决右滑返回手势和UIScrollView中的手势冲突(转)
    (转)iOS被开发者遗忘在角落的NSException-其实它很强大
    iOS 身份证最后一位是X,输入17位后自动补全X(转)
    springboot单机秒杀之queue队列
    springboot单机秒杀-aop+锁
    springbot单机秒杀,锁与事务之间的大坑
    spring-cloud学习之4.微服务请求打通
    spring-cloud学习之3.使用feign实现负载均衡
    spring-cloud学习之2.搭建请求网关spring-cloud-getway
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/13236433.html
Copyright © 2020-2023  润新知