zoukankan      html  css  js  c++  java
  • [CF1369D] TediousLee

    Description

    一个级别为 (1)RDB 是一个单独的节点。
    接着,对于所有 (i > 1),级别为 (i)RDB 的构成方法如下。
    先求出级别为 (i-1)RDB,然后对于该 RDB 中的每个节点 (x)

    • 如果 (x) 没有孩子,那么给他加上一个孩子。
    • 如果 (x) 只有一个孩子,那么给他加上两个孩子。
    • 如果 (x) 已经有了超过一个孩子,那么我们跳过节点 (x)

    接下来,我们定义一个 claw (见下图),它也是一棵具有特殊性质的树,并且将节点 (1) 称为这个 claw 的中心,其他的称为底部节点。

    现在,给出一个级别为 (n)RDB,初始时他上面的所有节点都为绿色,你可以进行一些操作。
    对于每次操作,你需要在给出的 RDB 中找到一个 claw,满足所有底部节点在 RDB 中都是中心节点的儿子,且这四个节点在 RDB 中都是绿色。然后将这四个节点染为黄色。
    问最多可以将多少个节点染成黄色。

    Solution

    容易找到一个递推关系,(n) 阶树的根结点的三个子节点对应的子树,其分别为 (n-1,n-2,n-2) 阶的树,并且,当 (3|n) 时,根结点时被选择的,其它情况下根结点是不被选择的。

    因此我们很容易得到递推关系 (f_n = f_{n-1} + 2f_{n-2} + 4[3|n])

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long 
    const int N = 2e+6+5;
    const int M = 1e+3+5;
    const int mod1 = 1e+9+7;
    const int mod2 = 998244353;
    
    #define dbg(x) cerr<<#x<<":"<<x<<endl
    
    int f[N];
    
    void presolve()
    {
    	f[0]=0;
    	f[1]=0;
    	f[2]=0;
    	for(int i=3;i<N;i++)
    	{
    		f[i]=(f[i-1]+2*f[i-2]+4*(i%3==0))%mod1;
    	}
    }
    
    void solve()
    {
    	int n;
    	cin>>n;
    	cout<<f[n]<<endl;
    }
    
    signed main()
    {
    	ios::sync_with_stdio(false);
    
    	presolve();
    
    	int t;
    	cin>>t;
    	while(t--)
    	{
    		solve();
    	}
    	
    	return 0;
    }
    
  • 相关阅读:
    使用RSL 给FLEX 瘦身
    网络游戏同步法则
    .NET中的内存管理,GC机制,内存释放过程
    C++静态成员函数小结(转)
    关于GetSystemMetrics()函数
    CImage
    assert()函数用法总结
    Win32 系统部分函数
    818瘦身简单过程(增加内存)
    818内存升级到128m
  • 原文地址:https://www.cnblogs.com/mollnn/p/14160645.html
Copyright © 2011-2022 走看看